当用户注销/登录时,后台进程(nohup&)暂停/恢复

当用户注销/登录时,后台进程(nohup&)暂停/恢复

Ubuntu 服务器 11.10

当普通(非 root)用户使用 nohup(nohup java ... &)启动进程时,如果用户断开与终端(ssh)的连接,进程将停止响应。当用户再次连接时,进程将再次开始响应。例如,进程是一个数据库(H2),当启动进程的用户断开与终端的连接时,它将停止响应查询,当用户再次登录时,它将再次开始响应。

是否存在我不知道的后台进程权限,阻止进程在后台运行?什么原因导致了这种行为?

答案1

nohup应该对你有用,你具体命令是什么?也许你漏掉了什么。以下是维基百科中关于它的部分:

Nohupping backgrounded jobs is typically used to avoid terminating them when logging
off from a remote SSH session. A different issue that often arises in this situation
is that ssh is refusing to log off ("hangs"), since it refuses to lose any data
from/to the background job(s).  This problem can also be overcome by redirecting all
three I/O streams:

nohup ./myprogram > foo.out 2> foo.err < /dev/null &

因此你可以做类似的事情:

ssh -n -f user@remotebox "sh -c 'cd /foo/bar; nohup ./myprogram > foo.out 2> foo.err < /dev/null &'"

如果还是不行,你可以试试screen。它将允许你在“后台”运行你的进程,并且在你注销后它仍会继续运行。

首先,ssh转到远程框,然后从那里使用screen并启动您的进程,您可以根据screen需要为您的会话命名。您不会真正注意到任何不同,但在该会话中启动您的进程。然后您可以screen使用命令退出会话Ctrl-a d。它看起来像这样:

user@remotebox:~$ screen -S foobarsession
user@remotebox:~$ startmyprocess
[detached from 4865.foobarsession]
user@remotebox:~$

然后,您可以退出 ssh 会话,并且该进程将继续运行。要screen稍后重新连接到会话,请 ssh 返回远程框并使用screen -r重新连接。您可以使用screen -ls列出会话。

user@remotebox:~$ screen -ls
There is a screen on:
        4865.foobarsession     (10/05/2012 11:10:57 AM)     (Detached)
1 Socket in /var/run/screen/S-user
user@remotebox:~$ screen -r foobarsession
user@remotebox:~$ screen -ls
        4865.foobarsession     (10/05/2012 11:10:57 AM)     (Attached)
1 Socket in /var/run/screen/S-user
user@remotebox:~$

答案2

以 启动的进程nohup ... &被设计为即使在终端进程退出后仍会运行。我不认为存在一个核心 unix 机制来暂停此类进程。尽管调度程序可能会更改其优先级(因为它可能被视为不太重要的进程)。

我很确定,该过程会继续运行,但是诸如管道之类的东西会阻塞它并阻止响应。

相关内容