在实际工作中,我们ssh等到远程的Linux上,运行一个程序,但是当我们关闭掉我们的连接终端断开ssh后,刚才运行着的程序也会自动被中断结束。当ssh连接断开后,如何让我们的程序继续在后台运行呢?下面介绍我常使用的两个方法。
使用nohup让程序在后台继续运行
常用命令:nohup ./test.sh & 【如果运行成功则默认会将标准输出重定向到当前目录的nohup.out文件中,当然可以自己重定向输出信息】
当需要将nohup后台运行的程序调到前台时,先jobs命令查看后台job编号,用 fg %n命令可以调回到前台运行(n是job的编号)。
PS:单独的&时可以让命令后台运行的,知识如果ssh会话断掉,&的命令也会自动退出。
screen让程序后台执行--一个强大的工具
简单来说,Screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。Screen中有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的telnet/SSH连接窗口那样。在screen中创建一个新的窗口有这样几种方式:
1.直接在命令行键入screen命令
[root@localhost ~]# screen
Screen将创建一个执行shell的全屏窗口。你可以执行任意shell程序,就像在ssh窗口中那样。在该窗口中键入exit退出该窗口,如果这是该screen会话的唯一窗口,该screen会话退出,否则screen自动切换到前一个窗口。
2.Screen命令后跟你要执行的程序。
[root@localhost ~]# screen vi test.c
Screen创建一个执行vi test.c的单窗口会话,退出vi将退出该窗口/会话。
3.以上两种方式都创建新的screen会话。我们还可以在一个已有screen会话中创建新的窗口。在当前screen窗口中键入C-a c,即Ctrl键+a键,之后再按下c键,screen 在该会话内生成一个新的窗口并切换到该窗口。
给screen发送命令使用了特殊的键组合C-a(Ctrl+a)。这是因为我们在键盘上键入的信息是直接发送给当前screen窗口,必须用其他方式向screen窗口管理器发出命令,默认情况下,screen接收以C-a开始的命令。这种命令形式在screen中叫做键绑定(key binding),C-a叫做命令字符(command character)。
可以通过C-a ?来查看所有的键绑定,我常用的键绑定有:
C-a ? 显示所有键绑定信息
C-a d 暂时断开screen会话
C-a k 杀掉当前窗口
C-a w 显示所有窗口列表
C-a tabnum 移动到某一个窗口或Tab
C-a n 移动到下一个窗口/tab
C-a p 移动到前一个窗口/tab
我的通常的真实使用场景如下:
ssh登录我的Linux服务器,screen ./test.sh 运行一个shell脚本,按键C-a d(先按Ctrl+a 再按d键)暂时断开screen会话;然后干别的事情(比如,散散步/打打乒乓球)去了(可能ssh连接已经被断开)。
过一会儿,回来重新登录,然后
screen -ls #显示所有的 screen sessions (C-a d后的session为detached状态)
screen -r [keyword] #找到我想要 screen session 恢复回来 (捡回来)
若 screen -ls 有 Attached sessions, 如果想要使用它,可以这样来做
screen -d [keyword] #强制 detach,以便用screen -r 「接手」过来
所以,一个比较tricky的办法是,scree -d -r [keyword] 强制detach一个session,再将其attach上来。
PS: screen功能很强大的,我通常也就使用了上面的基本功能。更多的,请看参考资料或者man screen
参考资料:
http://www.21andy.com/blog/20071121/677.html
http://www.ibm.com/developerworks/cn/linux/l-cn-screen/
http://blogold.chinaunix.net/u1/37553/showart_341863.html
现在我越来越喜欢用screen了(而不是nohup)