使用screen管理远程会话断开连接后程序仍然继续在后台执行
今晚进行数据库迁移操作,耗时有些长,担心终端异常中断导致转移程序中断而半途而废。因此考虑开screen来跑迁移程序。
如果终端异常断开,或网络中断,远程会话运行的程序就会中断。解决的办法有:
1.使用nohup命令
2.使用screen命令
用ssh连接服务器进行一些需要长时间运行的任务开一个远程终端窗口,在此期间是不能关掉窗口或断开连接,否则这些任务将被中断执行。
下面来看看关掉窗口或断开连接会使正在运行的任务中断的原因:
进程组:一个或多个进程的集合,每一个进程组有唯一一个进程ID
会话期:一个或多个进程组的集合,有唯一一个会话期首进程
会话期可以有一个单独的控制终端,与控制终端连接的会话期首进程叫做控制进程,当前与终端交互的进程为前台进程组,其余进程组称为后台进程组
挂断信号(SIGHUP)默认的动作是终止程序。
当终端接口检测到网络连接断开,将挂断信号发送给控制进程(会话期首进程)。
如果会话期首进程终止,则该信号发送到该会话期前台进程组。
一个进程退出导致一个孤儿进程组中产生时,如果任意一个孤儿进程组进程处于STOP状态,发送SIGHUP和SIGCONT信号到该进程组中所有进程。
因此,当网络中断或关掉终端窗口,控制进程收到SIGHUP信号退出,会导致该会话期内其他进程退出。
使用screen
Screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。Screen中有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的telnet/SSH连接窗口那样。创建screen窗口的方式:
1.直接输入screen命令
# screen
将创建一个执行shell的窗口,任意执行程序。输入exit命令将退出当前窗口。
2.在screen命令后跟上要执行的程序
# screen php move_security_log.php
3.在一个已有的screen会话中创建新的窗口。在当前screen窗口中键入ctrl+A+C,在该会话内生成一个新的窗口并切换到该窗口。还可以不中断screen窗口中运行的程序而暂时端口screen会话,并可以在随后重新连接该会话。如:
暂时中断会话:Ctrl+A+D
重新连接会话:
# screen -ls
There is a screen on:
836.pts-3.ubuntu (04/09/2012 01:53:53 AM) (Detached)
# screen -r 836
默认情况下,screen接收的命令是以Ctrl+A开头的。
不再解释了,具体看man screen.
转载于:https://blog.51cto.com/zorro/1199041