一、nohup
工作中经常会遇到这样的需求,通过SecureCRT或其它工具远程到服务器执行某个任务,而这个任务耗时又比较长,你又不得不等待它执行完毕,但是如果此间如果关掉窗口或断开连接又会导致任务被kill掉。之所以会出现这种状况,是在窗口关闭或网络断开时,系统会发送SIGHUP信号给会话控制进程,该进程会转发SIGHUP信号给前台运行进程,该信号的默认动作是终止程序,从而导致任务被kill掉,罪魁祸首就是SIGHUP信号。
如果能够忽略SIGHUP信号,则该问题就迎刃而解了,Linux提供的nohup命令就是为此而生的,nohup命令的语法格式如下:
nohup [argument ...] &
上面命令其实做了两件事,nohup忽略SIGHUP信号,&将任务放在后天运行。
需要注意的是:nohup默认将程序的标准输出和标准错误输出重定向到nohup.txt文件中,也可以用">filename 2>&1"来更改缺省的重定向文件名。
其实,nohup只是其中一个解决方案,Linux为我们提供了更强大的screen命令来解决此问题,更多解决方案请看这里。
二、screen
其实前面的问题只是screen功能的冰山一角,这里会详细介绍。
简单来说是一个可以在多个进程之间多路复用一个物理终端的窗口管理器或者代理。
1、简单三部曲
(1)创建会话
#screen -dmS xxx
上面命令用来建立一个处于断开模式的会话,其中,xxx为session name。
(2)列出会话
#screen -list
上面命令用来列出所有会话,这个有点恶心,毫无隐私可言。
(3)重连会话
#screen -r xxx
上面命令用来重新连接指定会话,其中,xxx为会话名称。
有了上面3个命令后,基本上你也算是screen圈子里的人了。
2、详细命令介绍
(1)创建会话
(A)直接在命令行中键入screen命令
#screen
上面命令将创建一个由screen管理的会话,除了享有screen的各种优势外,与直接SecureCRT没什么区别,你可以任意执行shell或者你的程序,在该窗口中输入exit回车则退出窗口,如果该screen会话只有唯一窗口,则会话直接退出,否则screen会自动切换到前一个窗口。
(B)screen命令后跟要执行的程序
#screen vi test.c
screen创建一个执行vi test.c的单窗口会话,退出vi将退出该窗口,如果会话有且仅有这个窗口,则会自动退出会话。
(C)在会话中创建多个窗口
在screen会话中可以创建多个窗口,在当前screen窗口中键入ctrl+a c即可,screen会在该会话中生成一个新的窗口并切换到该窗口。
(2)断开与重连
screen可以不中断窗口中正在运行的程序而仅仅暂时断开(detach)screen会话,并且可以在任意时间里重新连接(attach)该会话,此时可以原封不动地回到断开会话时的状态。在screen窗口中键入ctrl+a d,此时,screen会提示detached,一段时间后,screen -ls找回会话,重新连接screen -r xxx就能满血复活了。
需要注意的是:screen中任何命令都是由ctrl+a和另外一个字母组合出来的,前缀ctrl+a是必须的。
screen会话有几个状态,分别是attache(连接)、detache(断开)、dead(会话被人为kill掉)、remove(使用screen -wipe清除会话后的状态)。
screen重连会话除了可以用会话pid外,还可以用会话名称重连,后一种方式更直观和有意义。
(3)管理会话
(1)窗口命名
#ctrl+a A xxx
(2)列出窗口
#ctrl+a w
(3)保存窗口
#ctrl+a d
(4)退出窗口
#ctrl+a k
(5)屏幕切分
#ctrl+a S //水平切分
#ctrl+a | //垂直切分
#ctrl+a tab //在各区块之间切换(每个区块上都可以创建窗口并运行进程)
#ctrl+a X //关闭当前焦点所在区块
#ctrl+a Q //关闭除当前区块外的所有区块
(6)会话共享
#screen -x
更多screen信息可以参看。