简介
GNU Screen简称Screen或screen,源自GNU计划,是一个多重视窗管理程序。
screen的主要功能如下:
- 会话恢复:只要screen本身没有终止,在其内部运行的会话都可以恢复。这一点对于远程登录的用户特别有用——即使网络连接中断,用户也不会失去对已经打开的命令行会话的控制。只要再次登录到主机上执行
screen -r [name]
就可以恢复会话的运行。同样在暂时离开的时候,也可以执行分离命令detach,在保证里面的程序正常运行的情况下让screen挂起(切换到后台)。这一点和图形界面下的VNC很相似。 - 多窗口:在screen环境下,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存。用户可以通过快捷键在不同的窗口下切换,并可以自由的重定向各个窗口的输入和输出。
- 会话共享:screen可以让一个或多个用户从不同终端多次登录一个会话,并共享会话的所有特性(比如可以看到完全相同的输出)。它同时提供了窗口访问权限的机制,可以对窗口进行密码保护。
基本用法
安装screen
大部分系统不自带screen,你需要通过下列命令安装screen:
# RedHat
sudo yum install screen
# Debian
sudo apt install screen
# ArchLinux
sudo pacman -S screen
# And more...
screen命令的基本格式为 screen [-opts] [cmd [args]]
创建会话
想要创建一个新的screen会话,可以使用如下命令:
screen -R [name]
:创建一个名为name
的会话,若name
会话已存在,则直接进入name
会话。screen -S [name]
:创建一个名为name
的会话,不检查name
是否存在。
挂起会话
在会话中,使用快捷键Ctrl+A+D
来讲该会话送至后台运行
查看会话
输入screen -ls
或screen --list
来查看当前用户的所有会话
恢复会话
- 使用
screen -R [name]
:尝试恢复name
会话,若name
会话未创建或已连接,则新建一个 同名但不同PID
的name
会话。 - 使用
screen -r [name]
:直接恢复name
会话,若name
会话未创建,则告知使用者会话不存在。
销毁会话
- 在会话中:可以使用
exit
命令来销毁该会话,或使用快捷键Ctrl+D
- 不在会话中:使用
screen -S [name] -X quit
来销毁name
会话
实战
例如,我们需要在一台Linux
服务器上运行Minecraft
服务器:
-
创建一个名为
mc
的会话screen -R mc
-
进入服务器根目录并运行启动脚本
cd your/server/directory # 此出填写服务器根目录 bash shart.sh
-
将该会话挂起
按下键盘上的Ctrl+A
,在不松开按键的情况下再按下D
-
需要再次访问服务器后台时,输入以下命令
screen -R mc
-
如需销毁该会话,你可以执行下列操作
- 输入
stop
或按下Ctrl+C
来停止服务器(若服务器未停止运行) - 在该会话中输入
exit
或按下Ctrl+D
来销毁会话 - 在会话外输入
screen -S mc -X quit
来销毁会话
- 输入
进阶用法
screen高阶命令
- -dmS [name] 作为守护进程启动:以离线模式创建
name
会话 - -X [cmd] 向指定会话发送
cmd
命令
实战
我们需要在某台安装了Linux
的个人电脑上运行一个内网穿透客户端,并让它开机自启。
我们已经在服务器上部署内网穿透服务端NPS,并正确配置了客户端
- 将客户端
npc
解压至某个目录,如/opt/npc
- 在
/opt/npc
目录下编写启动脚本start_npc.sh
#! /bin/bash screen -dmS npc # 静默创建 npc 会话 screen -S npc -X stuff 'cd /opt/npc\n' # 进入 npc 安装目录 screen -S npc -X stuff './npc -server=your.domain:port -vkey=your#key -type=tcp\n' # 启动 npc 客户端
- 输入命令
sudo crontab -e
,然后再文件末尾追加一行@reboot /bin/bash /opt/npc/start_npc.sh
保存并退出编辑器
- 使用
sudo reboot
命令重启电脑后输入sudo screen -R npc
查看npc
是否正常运行
PS:
- 脚本中的
\n
相当于在shell
中按下Enter(回车)
按键,\n
可以跟在命令后,表示这行命令已完成,也可以自成一行