分类: LINUX
2008-05-04 21:38:04
大家在使用SSH或telnet远程连接服务器时,可能都遇到为一些长时间运行的任务而头疼,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为他们执行的时间太长了。必须等待它执行完毕,在此期间可不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了。也许nohup命令可以达到这个目的,如果程序的标准输出/标准错误是终端, nohup默认将其重定向到nohup.out文件。值得注意的是nohup命令只是使得程序忽略SIGHUP信号,还需要使用标记&把它放在后台运行。
nohup[argument…] &
虽然nohup很容易使用,但还是比较“简陋”的,对于简单的命令能够应付过来,对于复杂交互的程序就麻烦了。那么现在过来瞧瞧screen吧!
screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。screen中有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的telnet/SSH连接窗口那样。当断开或关闭终端时,只要不杀死screen的进程,待重新连接后任能继续断开前的操作。
启动screen方式有两种,一种是直接在命令提示符下输入screen,这时Screen将创建一个执行shell的全屏窗口。你可以执行任意shell程序,就像在ssh窗口中那样。在该窗口中键入exit退出该窗口,如果这是该screen会话的唯一窗口,该screen会话退出,否则screen自动切换到前一个窗口。另一种方式是在screen命令后跟你要执行的程序,例如“ screen ftp”,Screen创建一个执行ftp命令的单窗口会话,退出ftp将退出该窗口/会话。
screen的语法格式如下:
screen [ -options ] [ cmd [ args ] ]
常用的选项有:
-c file 使用配置文件file,而不使用默认的$HOME/.screenrc -d|-D [pid.tty.host] 不开启新的screen会话,而是断开其他正在运行的screen会话 -h<行数> 指定视窗的缓冲区行数。 -m 即使目前已在会话中的screen会话,仍强制建立新的screen会话。 -r sessionowner/ [pid.tty.host] 重新连接一个断开的会话。多用户模式下连接到其他用户screen会话需要指定sessionowner,需要setuid-root权限。 -R 先试图恢复离线的会话。若找不到离线的会话,即建立新的screen会话。 -s 指定建立新screen会话时,所要执行的shell。 -S sessionname 创建screen会话时为会话指定一个名字 -v 显示版本信息。 -x 恢复之前离线的screen会话。 -ls或--list 显示目前所有的screen会话。 -wipe 检查目前所有的screen会话,并删除已经无法使用的screen会话。
screen常用的组合键描述如下:
例如当我们ssh登录服务器后,使用scp在传输大文件时,通常的情况就是要耐心的等待文件传输完成才能将终端关闭,那么下面来看看通过screen带来的方便。
首先使用ssh登录服务器,在命令提示符下输入screen:
# screen
在screen shell中输入scp命令,输入密码后开始文件传输。如果不愿意等待,那么直接按下”Ctrl+a+d”的组合键,或者关闭当前的终端,随便怎么操作,只要不杀死screen会话就行。
# scp -r images 172.16.78.111:~ root@172.16.78.111's password: mondorescue.iso 0% 22MB 22.2MB/s 00:01
使用screen -ls可以查看当前系统所打开的screen会话,如下:
# screen -ls There are screens on: 20642.pts-1.white (Detached) 20713.pts-1.white (Detached) 2 Sockets in /tmp/screens/S-root.
若要其中的会话,则输入screen -r PID,如下:
# screen -r 20713
执行该命令后,马上就能看到刚才正在进行的scp命令的完成情况,是不是很方便?通过man screen可以看到更详细的screen的参数以及用法。