如何查找脚本是否以nohup结束运行?

lea*_*135 22 unix linux shell background-process

我尝试使用nohup运行脚本,

nohup script.sh &
Run Code Online (Sandbox Code Playgroud)

当我尝试

ps -ef | grep "script.sh"
Run Code Online (Sandbox Code Playgroud)

除了使用该字符串作为参数运行的grep之外,我找不到它.

我做得对吗?这是否意味着该流程确实已完成执行?谢谢.

Edw*_*ale 16

在shell脚本的开头,将PID写入文件(例如,在/ var/run中).然后,您可以只搜索该PID以了解该过程是否已完成.您可以使用内置$$变量获取shell脚本的PID .

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

echo $$ > /var/run/myscript.pid
Run Code Online (Sandbox Code Playgroud)

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

ps -p `cat /var/run/myscript.pid`
Run Code Online (Sandbox Code Playgroud)

您可能无法以/var/run普通用户身份进行写入.如果没有,请使用/tmp

  • 注意事项:PID有时会被重复使用(更常见的是在没有强随机性的操作系统上,或者在具有大量短期进程的系统上).偏执者可能想要检查进程是否具有正确的父($$),或者让子脚本在退出时删除myscript.pid文件(类似于``trap'rm /var/run/myscript.pid EXIT'' ). 或两者. (10认同)

unb*_*eli 15

取决于nohup实现,但在大多数情况下它将起作用.跑完之后

nohup script.sh &
Run Code Online (Sandbox Code Playgroud)

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

HISPID=$!
Run Code Online (Sandbox Code Playgroud)

然后你可以用ps或kill检查它是否存在:

ps -p $HISPID
kill -0 $HISPID
Run Code Online (Sandbox Code Playgroud)

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