25

我尝试使用 nohup 运行脚本,例如,

nohup script.sh &

当我尝试

ps -ef | grep "script.sh"

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

我做对了吗?这是否意味着该进程确实已经执行完毕?谢谢。

4

6 回答 6

21

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

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

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

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

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

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

于 2010-05-31T14:06:27.020 回答
19

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

nohup script.sh &

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

HISPID=$!

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

ps -p $HISPID
kill -0 $HISPID

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

于 2010-05-31T14:12:01.120 回答
4

我按照 scompt.com 的建议修改了我的脚本以存储pid

然后我注意到pid已写入输出,因此无需存储它:

$ nohup ./sync-all.production.sh > sync-all.production.log &

[1] 3428
于 2014-05-15T22:03:01.607 回答
4

美元!绝对是 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 章是关于守护进程的。

于 2010-06-01T10:24:59.200 回答
3

有效的是

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

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

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

于 2014-07-05T18:56:35.067 回答
1

代码:

ps r

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

于 2015-03-25T09:45:40.793 回答