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 机制来暂停此类进程。尽管调度程序可能会更改其优先级(因为它可能被视为不太重要的进程)。
我很确定,该过程会继续运行,但是诸如管道之类的东西会阻塞它并阻止响应。