我尝试使用 nohup 运行脚本,例如,
nohup script.sh &
当我尝试
ps -ef | grep "script.sh"
除了使用该字符串作为参数运行的 grep 之外,我在那里找不到它。
我做对了吗?这是否意味着该进程确实已经执行完毕?谢谢。
我尝试使用 nohup 运行脚本,例如,
nohup script.sh &
当我尝试
ps -ef | grep "script.sh"
除了使用该字符串作为参数运行的 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
我按照 scompt.com 的建议修改了我的脚本以存储pid
然后我注意到pid
已写入输出,因此无需存储它:
$ nohup ./sync-all.production.sh > sync-all.production.log &
[1] 3428
美元!绝对是 ksh 和 ksh93 的一部分。
echo $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
对于任何仍在运行的子进程,wait 语句都会暂停。通常,您不会将进程放入后台,期望它永远运行,然后完全忘记它。
如果您想要一个永久运行的完全分离的进程,请考虑使用守护进程。有些人在 shell 中编写守护进程——不是最佳实践——但它已经完成了。通常 UNIX 守护程序是用 C 编写的。
Stevens 的“UNIX 环境中的高级编程”第 2 章第 13 章是关于守护进程的。
有效的是
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
报告所有正在运行的进程。