如何find一个脚本作为nohup运行是否完成?

我试着用nohup来运行脚本,

nohup script.sh & 

当我尝试

 ps -ef | grep "script.sh" 

除了用这个string作为参数运行的grep之外,我找不到它。

我做对了吗? 这是否意味着这个过程确实已经完成了? 谢谢。

在shell脚本的开始处,将PID写入文件(例如,在/ var / run中)。 然后,您可以只搜索该PID来知道该过程是否完成。 你可以使用内置的$$变量来获得shell脚本的PID。

要记录PID,请放在脚本的顶部:

 echo $$ > /var/run/myscript.pid 

然后,检查它是否仍在运行:

 ps -p `cat /var/run/myscript.pid` 

您可能无法以普通用户的身份写入/var/run 。 如果没有,只需使用/tmp

受nohup实施,但在大多数情况下,它会起作用。 运行后

 nohup script.sh & 

将PID存储到变量中。 $! 是最后一个后台进程的PID。

 HISPID=$! 

那么你可以检查一下是否有ps或kill:

 ps -p $HISPID kill -0 $HISPID 

与发布的其他解决方案不同,这不需要修改script.sh

$! 肯定是ksh和ksh93的一部分。

 echo $SHELL 

会显示你正在运行的shell。

合理使用“

 #!/bin/ksh nohup ./myscript.sh argument1 2>&1> mylogfile & # do some other task cnt=0 while [ $cnt -le 100 ] do # work on another task here cnt=$(( $cnt + 1 )) done wait 

等待语句暂停任何仍在运行的子进程。 通常情况下,你不会把一个进程拖到后台,期望它永远运行,然后完全忘记它。

如果您想要一个永远运行的完全分离的进程,请考虑一个守护进程。 有些人在shell中写入守护进程 – 而不是最佳实践 – 但已经完成了。 通常UNIX守护进程是用C写的

Stevens在UNIx环境下的高级程序设计第十三章是关于守护进程的。

我跟着scompt.com的建议修改我的脚本来存储pid

然后我注意到这个pid被写入输出,所以不需要存储它:

 $ nohup ./sync-all.production.sh > sync-all.production.log & [1] 3428 

什么工作是

 sudo ps -e | grep [script name or fragment of name] 

例如一个名为“mf-sync.js”的脚本

 sudo ps -e | grep mf-sync 

显示脚本名称和pid; 那么我可以使用,例如,如果PID是1234

 sudo kill 1234 

接下来,我需要添加一个超时,以便在正常运行足够的时间后自动终止它,但这是另一个问题

同时我可以照顾这个过程,为我的客户端运行同步,直到我有时间测试脚本中的超时

码:

 ps r 

报告所有正在运行的进程。