我试着用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
报告所有正在运行的进程。