丁老二 發表於 2023-9-8 00:00:00

使用screen管理远程会话断开连接后程序仍然继续在后台执行

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