写于:2014-06-30	最近一次更新:2015-08-06

screen有效管理远程会话 用ssh登录到服务器操作时,有些操作若在执行时中断会导致严重的后果;或者是我的网络不稳定,我希望重新连接上服务器后恢复到之前的会话,以便继续之前未完成的工作;那么,在连接上远程服务器后,应该首先在服务器上执行screen,创建一个screen会话,然后,所有后续命令都在screen中执行,当在执行后续命令时网络中断,则重新远程连接时可使用命令screen -ls列出当前存在的screen会话,如 [sman@mnxnm ~]$ screen -ls There are screens on: 5399.pts-3.mnxnm (Detached) 4921.pts-1.mnxnm (Attached) 2 Sockets in /var/run/screen/S-sman. 5399这个就是之前中断的会话,状态为Detached,使用命令screen -r 5399即可重新恢复到中断之前的会话,继续完成未完成的工作
screen有效共享会话 远程协助时,利用screen会话共享使协助者和被协助者共同使用同一个会话界面,两个人对共同完成一个任务,A的操作B可见,B的操作A也可见,即AB两个人看到的界面一模一样 同一帐号会话共享 A登录到服务器后,B用A的帐号登录到服务器,直接执行下面的命令即可 screen -x 4921 不同帐号会话共享 特别注意:不同帐号之间实现screen共享需要screen命令具有SUID权限 如,A执行以下操作,运行screen -d -m -S toshare创建名为toshare的screen会话, 然后,在当前screen会话窗口按Ctrl + a ,输入冒号:,在冒号后输入multiuser on,回车,就打开了多用户共享开关 授权用户B能够连接A共享的会话:在当前screen会话窗口按Ctrl + a ,输入冒号:,在冒号后输入acladd B,回车即可 B 输入命令screen -x usernameA/toshare,即可连接到A的共享会话
如何退出screen,有两种方法 一,在当前screen会话中输入exit,终结当前screen会话 二,通过杀死其PID的方式退出screen程序。如kill 5399,杀死5399这个screen会话,kill 4921杀死4921这个screen
经验技巧 巧妙运用ssh的-t参数实现远程登录时自动运行screen (即ssh直接登录到screen,登录后输入exit退出screen的同时也就退出了ssh远程连接) 一般思路是,ssh远程登录服务器,首先成功登入服务器,再运行screen 或者一次性输入“ssh man@mnxnm.cn screen -xR forhelp",但提示出错must be connected to a terminal [另外,sshd服务提供了一个可执行脚本文件 ~/.ssh/rc ,该文件中的命令在“用户成功登入后shell未加载前”自动执行(注意:为安全起见,sshd不允许该脚本执行能改变环境变量的命令,如export,alias等);在该文件中写入screen -xR forhelp后,使用ssh登入时同样提示must be connected to a terminal] 这个出错信息说明了screen必须依附于一个终端, 必须依附一个终端?ssh命令的 -t 参数的作用不就是强制分配一个假终端吗? 于是执行 ssh -t man@mnxnm.cn screen -xR forhelp,成功登入且自动使用了screen 为了使用方便,使用命令别名,在/etc/profile中写入 alias ssc="ssh -t man@mnxnm.cn screen -xR forhelp" 并执行命令". /etc/profile"使别名生效,这样以后只要执行ssc就可以实现ssh登录时自动使用screen [注解:screen参数 -x 和参数 -R 结合使用 1,当screen会话forhelp不存在时,则新建名为forhelp的screen会话,并进入共享形式 2,当screen会话forhelp存在时,且状态为attached时,则以共享的形式进入名为forhelp的screen会话 3,当screen会话forhelp存在时,且状态为detached时,则重新attach名为forhelp的screen会话,并进入共享形式 ]
拓展: 在远程服务器上执行命令时,很多人使用的是" nohup 待执行程序命令及待执行程序命令的参数 &"的方式,避免远程连接中断导致正在执行的程序中断或异常,但是除了这个任务要做以外没有其他任务了,只想实时的跟踪观察进度;实际上在远程服务器上打开screen,在screen里执行需要耗费长时间的程序且实时观察进度,就算网络连接中断了,也不会影响程序的继续运行,重新登录到服务器再连接上正在运行程序的screen即可