关于如何在退出SSH后继续执行后台任务
兴之所至 四月 1st, 2009有人问“SSH登陆服务器,在服务器以后台方式运行任务,之后退出SSH,结果放在后台运行的任务也会退出。如何让在后台运行的任务不因SSH的退出而退出?”
这个问题其实有两种情况(与是怎么退出SSH有关),如下:
1. 如果 SSH 上去,执行比如 ./somecommand & 然后 logout 退出,然后再 SSH 上去看,会发现 ./somecommand 运行得好好的;
2. 如果 SSH 上去,执行 ./somecommand & 然后不是 logout退出,而是直接把 SSH 终端窗口关掉(或者类似情况比如像把本地计算机关机之类的),再 SSH 上去看就会发现 ./somecommand 没了。
可以通过以下方式验证:
远程SSH:
ping xugaofei.com | tee foo.txt &
本地:
tail -f foo.txt
这样tail会不断打印输入,然后远程SSH退出,可以发现tail仍然有新的输出产生,表明后台任务没有结束。
通过pstree查看进程树也可以看到:
&后台运行,logout退出前它们的进程树结构如下:
init-sshd—sshd—sshd—bash-ping
logout主动退出后进程树是这样如下:
init-ping
所以不主动logout退出直接断开连接会导致后台任务结束,但主动logout退出不会结束后台任务。
四月 19th, 2009 at 5:23 下午
screen
–a better choice, with more features.
四月 20th, 2009 at 9:27 上午
是啊,screen是很方便很好用
这个是当时用的一些机器上没装screen,就研究了一下&后台运行为什么可能不执行,写的一点笔记。
四月 20th, 2009 at 10:04 上午
Got that.
I always be lazy, so as to look for alternate solutions.
You are a really hacker. :) (砍的精神 :) )
我一般是ctrl-D退出ssh的bash,后台会继续。可见ctrl-D和logout命令一样(或者 几乎一样?)
$ ping xugaofei.com | tee foo.txt &
我把gnome-terminal 用alt-F4关闭了(有提示:There is still a process running in this terminal. Closing the terminal will kill it.).
这样关闭的话,后台进程就停了。
如果你说的未正常logout,那么nohup有用.
$ ping xugaofei.com | nohup tee bar.txt &
nohup: appending output to `nohup.out’
把gnome-terminal 用alt-F4关闭。
再登上去看,nohup.out和bar.txt都在增加,输出是一样的。
问题:
1. Ctrl-D 完等于 logout?
2. ping xugaofei.com | tee foo.txt & 这时候kill掉这个tee进程,前面的ping也结束,看来管道的接收端关闭的话,输入的进程也关闭?
3. 那么HUP是什么时候发出的?
四月 20th, 2009 at 11:37 上午
1. Ctrl-D、logout和exit不完等于,还有些小区别,比如logout是用来退出login shell,所以假如在sub-shell使用logout,会提示“logout: not login shell: use `exit’”。和logout相比,Ctrl-D和exit更接近。
2. 嗯,看来是这样,管道接收端关闭,输入端也关闭。
3. HUP信号是关闭时发出的,不过我觉得这个很可能与具体软件有关,不一定所有软件遇到Alt+F4关闭操作都会发出HUP信号。另外shell里有个huponexit选项,默认是关闭的,可以通过shopt -s huponexit打开,如果打开这个,则exit这样的正常退出也会发出HUP信号,即也会使后台结束。
四月 29th, 2009 at 10:56 上午
关键是SIGHUP
如果运行的程序可以正确处理SIGHUP,无论你怎么退出都不会有问题
当然实际情况不是所有的程序你都可以对信号进行处理,所以有了nohup