![当我关闭 SSH 终端时 nohup 结束,并且在运行时不会出现在 ps/job 上](https://linux22.com/image/183998/%E5%BD%93%E6%88%91%E5%85%B3%E9%97%AD%20SSH%20%E7%BB%88%E7%AB%AF%E6%97%B6%20nohup%20%E7%BB%93%E6%9D%9F%EF%BC%8C%E5%B9%B6%E4%B8%94%E5%9C%A8%E8%BF%90%E8%A1%8C%E6%97%B6%E4%B8%8D%E4%BC%9A%E5%87%BA%E7%8E%B0%E5%9C%A8%20ps%2Fjob%20%E4%B8%8A.png)
我有一个 AWS EC2 Ubuntu 20.04 实例,通过 puTTY SSH 访问。通过以下方式运行 Python 进程开放MPI通过以下命令在非 root 上:
nohup mpirun python3 job.py
当外壳打开时,它可以正常运行。尽管使用ps
andjob
没有显示进程,但我可以通过 nohup.out 和不断变化的文件系统看到它在运行数小时后仍在工作。
当我关闭 shell 时,nohup 进程结束。我可能还应该注意到,当我运行上面的 nohup 命令时,我无法再输入任何内容(光标变为空白)。因此,当我跑到ps
上面时job
,我必须打开第二个外壳。我以前从未使用过 nohup 并认为这是不正常的。
我调查了 nohup.out 文件是否有错误,但发现没有写入任何内容。
所以总而言之:
关闭 SSH 实例(puTTY)结束 nohup 进程
ps 和 job 没有列出 nohup 进程,即使我知道它正在运行
如果需要的话我可以回答更多问题
答案1
jobs
只能显示当前 shell 的作业。
裸ps
显示与当前用户具有相同有效用户 ID 且与调用者具有相同控制终端的进程。您需要例如ps -e
查看其他进程(但不一定是操作系统中的所有进程)。
如果你跑
nohup something … &
然后您将能够在同一 shell 中运行jobs
或ps
。不要期望看到nohup
。它的任务是以特定方式运行something
,它不需要持续。期望看到something
。
因此,您的进程可能幸存下来,而您只是假设它已经死亡。又或许它真的死了。看为什么进程被杀死nohup
?这回答其中提到了两种可能性:
KillUserProcesses=yes
在logind.conf
(系统);- 或者生成的进程实现自己的处理程序,
SIGHUP
该处理程序会覆盖nohup
.
更多这里:nohup
和disown
之间的区别&
。如果我理解正确,disown
如果生成的进程实现了自己的处理程序,则可以提供帮助SIGHUP
。像这样使用它:
nohup something … &
disown