远程登陆到Linux服务器后,经常需要执行一些需要很长时间才能完成的命令或者需要保持在线可以交互的命令,比如数据备份,文件传输等等。保持终端在线并等待命令执行完成显然非攻城狮所能接受,有时终端异常中断还会导致尚未完成的任务被Kill。这时,就需要利用Screen命令来完成,它是GNU提供的用户命令行终端切换的工具,可以保持会话永久在线,并能自由切换。
基本使用
创建会话
需要注意会话名字允许重复,建议尽量避免使用重名的session,重入时就需要特别指定PID,而不能单单使用名字。
#在新会话中打开默认shell终端
screen -S [SESSION_NAME]
#在新会话中打开vi,可以随时Ctrla,d临时退出。vi命令退出时会话自动结束
screen -S vi /tmp/a.txt #
# 创建会话,但直接detach
screen -m -d [SESSION_NAME]
退出会话
退出当前会话可以直接执行
screen -d
如果任务是交互式的,则可以使用快捷键Ctrl+a,d退出。
在其他会话中可以执行
screen -d [SESSION_NAME]
恢复会话
screen -r [SESSION_NAME]
# -R 如果未发现会话就新建一个
screen -R [SESSION_NAME]
列出所有会话
screen -ls
screen -list
结束会话
会话创建时的任务或者shell退出时,会话自动结束。
Ctrl+a, \ 可以强制结束当前会话。
进阶使用
会话共享
使用 -x选项可以共享会话,两个会话都可以执行命令,而且双方可以同时看到,相当于窗口共享。
screen -x [SESSION_NAME]
发送命令/输入到会话
使用- X选项可以发送交互文本到screen会话,比如:
#如果是执行命令,记得末尾的空格
#如果有多个窗口,可以 -p 指定窗口ID
screen -S [SESSION_NAME] -X stuff "ping www.uio.cn\n"
-X选项进阶
除了可以发送命令或输入外,- X还有很多功能,参考帮助文档
# 修改session name
screen -S [OLD_NAME] -X sessionname [NEW_NAME]
# 退出会话
screen -S [SESSION_NAME] -X quit
多窗口操作
screen支持多窗口操作,这样就可以避免需要打开多个登录窗口:
Ctrl+a, c 可以创建一个新的窗口
Ctrl+a,w 查看窗口列表
Ctrl+a, 0/1/2… 切换到指定数字ID的窗口
Ctrl+a,n 切换到下一个窗口
神奇的Ctrl+a
Ctrl+a是screen的控制命令,可以使用 Ctrl+a, ? 来查看支持的操作列表。比如:
Ctrl+a, q 强制杀掉会话
Ctrl+a, z 暂时退出会话,fg命令恢复
其他工具对比
nohup
nohup也可以启动后台任务,可以通过命令来把任务切换到后台和前台,但一旦终端退出,就无法再切换到任务了。
except
except是用于交互式命令的工具,定位不同。