我使用nohup
以下命令运行 shell 脚本:
nohup ./run.sh &
我的问题是:退出终端并稍后返回后,如果该过程已完成或仍在运行,我该如何检索有关该过程的信息?
答案1
通常,您可以检查 的输出ps x
。 要么有,run.sh
要么没有。 如果有,则可能是您要查找的进程,也可能是其他进程run.sh
。 可能需要进一步调查。
不过还有一个技巧。Notenohup
会打印如下消息:
nohup: ignoring input and appending output to /home/alli/nohup.out
现在调用:
lsof /home/alli/nohup.out
如果您的run.sh
调用nohup
仍在运行,它应该出现在输出中lsof
(两次,因为nohup
将文件描述符1
和重定向2
到nohup.out
)。如果您nohup
多次使用,lsof
应该返回多个进程。如果您nohup
多次使用同一个可执行文件,您可能需要检查/proc/$pid/
(例子) 来区分它们。
我会用tmux
首先。事实上我每天都在用它。
答案2
您可以在启动进程后立即使用以下命令将ped 进程的值存储nohup
在文件中:$!
nohup the_process &
然后当你回来时读取 PID 并检查进程是否正在运行。如果是,检查它是否是你想要的那种进程。(PID 可能已被重新分配给另一个进程。)
如果它不会破坏进程的运行,您还可以向进程传递一个虚假参数,当您读取输出时,该参数将作为提示ps
。例如:
$ cat p.bash
#!/bin/bash
sleep 10
$ nohup ./p.bash some_id_hint &
[1] 14139
nohup: ignoring input and appending output to 'nohup.out'
$ echo $!
14139
$ ps 14139
PID TTY STAT TIME COMMAND
14139 pts/1 S 0:00 /bin/bash ./p.bash some_id_hint