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

默北 Linux使用screen管理远程会话断开连接后程序仍然继续在后台执行已关闭评论13,707字数 1136阅读3分47秒阅读模式

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

今晚进行数据库迁移操作,耗时有些长,担心终端异常中断导致转移程序中断而半途而废。因此考虑开screen来跑迁移程序。文章源自运维生存时间-https://www.ttlsa.com/linux/disconnect-screen-program-already-running/

如果终端异常断开,或网络中断,远程会话运行的程序就会中断。解决的办法有:文章源自运维生存时间-https://www.ttlsa.com/linux/disconnect-screen-program-already-running/

1.使用nohup命令文章源自运维生存时间-https://www.ttlsa.com/linux/disconnect-screen-program-already-running/

2.使用screen命令文章源自运维生存时间-https://www.ttlsa.com/linux/disconnect-screen-program-already-running/

用ssh连接服务器进行一些需要长时间运行的任务开一个远程终端窗口,在此期间是不能关掉窗口或断开连接,否则这些任务将被中断执行。文章源自运维生存时间-https://www.ttlsa.com/linux/disconnect-screen-program-already-running/

下面来看看关掉窗口或断开连接会使正在运行的任务中断的原因:文章源自运维生存时间-https://www.ttlsa.com/linux/disconnect-screen-program-already-running/

进程组:一个或多个进程的集合,每一个进程组有唯一一个进程ID文章源自运维生存时间-https://www.ttlsa.com/linux/disconnect-screen-program-already-running/

会话期:一个或多个进程组的集合,有唯一一个会话期首进程文章源自运维生存时间-https://www.ttlsa.com/linux/disconnect-screen-program-already-running/

会话期可以有一个单独的控制终端,与控制终端连接的会话期首进程叫做控制进程,当前与终端交互的进程为前台进程组,其余进程组称为后台进程组文章源自运维生存时间-https://www.ttlsa.com/linux/disconnect-screen-program-already-running/

挂断信号(SIGHUP)默认的动作是终止程序。文章源自运维生存时间-https://www.ttlsa.com/linux/disconnect-screen-program-already-running/

当终端接口检测到网络连接断开,将挂断信号发送给控制进程(会话期首进程)。文章源自运维生存时间-https://www.ttlsa.com/linux/disconnect-screen-program-already-running/

如果会话期首进程终止,则该信号发送到该会话期前台进程组。文章源自运维生存时间-https://www.ttlsa.com/linux/disconnect-screen-program-already-running/

一个进程退出导致一个孤儿进程组中产生时,如果任意一个孤儿进程组进程处于STOP状态,发送SIGHUP和SIGCONT信号到该进程组中所有进程。文章源自运维生存时间-https://www.ttlsa.com/linux/disconnect-screen-program-already-running/

因此,当网络中断或关掉终端窗口,控制进程收到SIGHUP信号退出,会导致该会话期内其他进程退出。文章源自运维生存时间-https://www.ttlsa.com/linux/disconnect-screen-program-already-running/

使用screen文章源自运维生存时间-https://www.ttlsa.com/linux/disconnect-screen-program-already-running/

Screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。Screen中有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的telnet/SSH连接窗口那样。创建screen窗口的方式:文章源自运维生存时间-https://www.ttlsa.com/linux/disconnect-screen-program-already-running/

1.直接输入screen命令文章源自运维生存时间-https://www.ttlsa.com/linux/disconnect-screen-program-already-running/

# screen文章源自运维生存时间-https://www.ttlsa.com/linux/disconnect-screen-program-already-running/

将创建一个执行shell的窗口,任意执行程序。输入exit命令将退出当前窗口。文章源自运维生存时间-https://www.ttlsa.com/linux/disconnect-screen-program-already-running/

2.在screen命令后跟上要执行的程序文章源自运维生存时间-https://www.ttlsa.com/linux/disconnect-screen-program-already-running/

# 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://www.ttlsa.com/html/1243.html

weinxin
我的微信
微信公众号
扫一扫关注运维生存时间公众号,获取最新技术文章~
默北
  • 本文由 发表于 09/04/2012 02:08:56
  • 转载请务必保留本文链接:https://www.ttlsa.com/linux/disconnect-screen-program-already-running/
  • Linux
  • nohup
  • screen
  • SecureCRT
  • SIGCONT
  • SIGHUP
  • ssh
  • 会话
  • 开screen
  • 终端