Linux下的screen命令
在使用SSH或者telent远程登录到Linux 服务器,经常运行一些需要很长时间才能完成的任务,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为它们执行的时间太长了。必须等待它们执行完毕,在此期间不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了。
安装
CentOS下默认没有安装该命令,从screen的官方网站下载,下载地址:http://ftp.gnu.org/gnu/screen/。
- 解压后执行
./configure
。 - 执行
make
命令。在执行make命令时会遇到错误pty.c:38:26: 错误:sys/stropts.h:没有那个文件或目录
,在/usr/install/sys/目录下创建一个stropts.h的空文件即可。 - 执行
make install
,该命令并不会将screen命令复制到系统的PATH变量包含的路径下,即不能执行screen命令。 - 执行
install -m 644 etc/etcscreenrc /etc/screenrc
。 - 执行
cp screen /bin/
。 - 执行
cp doc/man/man1/screen.1 /usr/share/man/man1/
,即可以可使用man screen
查看帮助。
实现原理
当关闭窗口或断开连接时,内核会将SIGHUP信号发送到会话期首进程,进程对SIGHUP的处理动作为终止。如果会话期首进程终止,则该信号发送到该会话期前台进程组。一个进程退出导致一个孤儿进程组中产生时,如果任意一个孤儿进程组进程处于STOP状态,发送SIGHUP和SIGCONT信号到该进程组中所有进程。因此当网络断开或终端窗口关闭后,控制进程收到SIGHUP信号退出,会导致该会话期内其他进程退出。
为解决上述问题,Linux程序在设计时可设计成守护进程的方式启动。
另外也可以通过nohup 命令 &
的方式启动来解决问题。
新建screen
- 直接输入
screen
命令即可使用。 - 输入
screen -S kuring
,这里给screen取了一个名字,方便辨认。 screen 命令
直接在screen中执行命令,命令结束后screen退出。
分离与恢复
在screen窗口中执行ctrl + a d
命令,screen会给出_[detached]_提示,并恢复到执行screen之前的bash。
查找之前的screen执行screen -ls
,会列出当前打开的screen。
1 | There are screens on: |
这里系统中打开了两个screen,一个为Attached,另一个为Detached。
重新连接执行screen -r kuring
或screen -r 8449
或screen -r
,当系统中仅有一个处于Detached状态的screen时就可以直接执行screen -r
命令。
关闭窗口
在screen的shell中执行exit
命令即可关闭screen。
也可以执行ctrl + a k
,会杀死当前screen中的所有运行进程。
错误
在screen中执行vi命令时会提示_E437: terminal capability “cm” required_错误,执行echo $TERM
查看发现打印值为_screen_,而未执行screen时的bash打印值为_xterm_,在screen中执行export TERM=xterm
即可解决该问题。
参考文档
更多高级使用方法请参考以下文档: