PKUWWT

GNU Screen--介绍和初学者指南[译]

Source

作者: 来自于Technologyjeduthun

大部分的类Unix操作系统,比如Linux, MacOS X, 以及BSD,都有一个称为GNU Screen的终端小工具。在终端武士手中,这是一个强悍的工具,在文本人机交互世界中堪称是多功能的瑞士军刀。

这个工具虽然非常有用,但是用者寥寥。为何?一则少有人知道它的存在,二则即使知道也不清楚它是干什么用的。在本文中,我会解释这个屏幕(screen)到底能为你做神马,并且提供一些简单的指令来帮助你使用screen来完成基本的任务。我的听众应该是那些熟练使用命令行却少有使用screen者。

screen能干啥

Screen的最准确的描述是终端选择器(terminal multiplexer)。通过它,你可以在一个终端内运行任意多个基于终端的应用,包括交互式命令shell,基于文本光标的应用,文本编辑器等。大部分沉迷于屏幕的人都有这样的需求。我曾经在登陆后开启十多个终端模拟器:一个用来读邮件,一个用来编辑代码,一个编译代码,一个读新闻,一个用于登陆网站的shell,诸如此类。现在,我只启动一个终端模拟器,然后在里面运行screen。问题解决了。

screen其它主要的功能是能够将终端模拟器与正在运行的程序解耦合。这表示你可以让程序继续运行,即使你不小心关掉了终端模拟器,甚至登出帐户后它依然在运行,然后,你可以原样恢复到你面前。这实际上构成了一个”会话”,你可以在里面运行多个终端程序,这些程序仿佛飘浮不定,你可以将它们绑定到任何终端上去,没有终端也木有关系。

开始使用screen:启动并在程序之间切换

启动screen只需要在你最喜欢的命令提示符中输入screen命令即可。你很可能会看到一个欢迎信息。忽略之,你得到的是一个包含了shell提示符的空的终端界面,和启动screen之前没有两样。发生了什么?

每个在screen下运行的程序都是在一个窗口中运行,每个窗口都由唯一的数字标识。screen生成一个新窗口,标号为0,然后在里面启动一个命令行shell。在你的新窗口中输入一些命令,以便你能够呆会儿切换回来时还能识别出来。

现在创建另外一个窗口,其标号应该是1。要实现这一点,输入C-a c,也就是按着Ctrl-a,然后再按c(你可以记为: create window)。

现在,你有了两个窗口,可以来回切换了。切换的快捷键是C-a C-a,它会在最近的两个窗口中来回切换。在你拥有多个程序时,其它一些窗口切换方法会派上用场:

  • C-a nC-a p,按窗口标号进入前一个/后一个窗口。
  • C-a N,其中N指的是0-9之间的数字,切换至指定的窗口
  • C-a ",获得窗口列表的全屏显示。你可以在这个列表中使用方向键导航(或vi风格的j,k键),选中一个窗口之后(高亮),使用回车键Enter去激活。
  • C-a w,给出一个小的,不可交互的窗口列表。有可能显示在终端的标题栏上。

当你使用一个窗口时,输入C-a A给它设置一个名称。这个名称会被用于窗口列表,也可以帮助你记忆多个窗口中每个窗口的用途。

退出窗口中的最后一个程序会导致这个窗口消失。你也可以用C-a K来终止运行异常的程序。

分离与再附着:终端解耦合的魔法

如果你操练了上述的功能,你已经成功创建了一个screen会话。你可以从这个会话中分离,快捷键是C-a d。你也可以直接关闭包含该会话的终端模拟器。但是,这两种操作都没有实际终止会话。它们所做的只不过是将会话与当前终端解除绑定。你用screen运行的所有程序仍然在后台运行。我不骗你。

试验一下:只关闭你做上面的练习所用的终端模拟器。然后,登出当前用户,然后再登陆进去。开启一个新的终端模拟器,执行screen -r(这里的r明显指的是reattach)。你会回到你分离时的那个状态。

译者注:对linux系统是如此,但对于cygwin可能并非如此。cygwin中如果关闭了所有的窗口也就相当于关机了。

你可以充分利用想像力,将这种功能用到很多场合中。你可以让所有必要的程序运行一遍,让它们保留在一个持久的screen会话中。有些人可以让这种”screen运行”维持数月。

另外一个分离和再附着的好的用途是作为一个控制台模式的”远程桌面”。你可以从一个工作时的screen会话中分离出来,然后登陆到家里的机器上,最后再附着。非常,非常贴心。只需要再费一点点力气,你甚至可以让多个终端都附着到同一个会话上—-这对于协作和会议是非常有用的。

复制,粘贴,和回滚缓冲区

screen记录了一定数量的回滚行(大小是可配置的),你会用到这个功能,因为在使用screen时,你就不能再用终端模拟器的回滚功能了。可以通过进入”复制模式”来访问回滚缓冲区,快捷键是C-a [,退出按ESC即可。你可以在回滚缓冲区中标记文字,然后用C-a ]进行粘贴。screen还能够记录日志到文件,在这里就不多介绍了。

监控沉寂与活动

一个批量执行程序的缺点是不能同时监控所有程序的运行,因为一般你只能一次看到一个。(事实上,你可以将screen分裂成多个,然后同时看多个,但这个高级功能不在本文讨论范围之内。) 为了缓解这个问题,screen支持用户监控沉寂了的窗口(比如一个编译已经结束了),或活动窗口(比如有人在你的IRC通道上呼叫你了)。

开启或结束当前窗口的30秒沉寂的快捷键是C-a _,而监控活动窗口的开关快捷键是C-a M

让它离开

如你所见,screen并不容易被终止。你不能通过关闭终端来关闭screen。(事实上,你可以做到,只不过那些进程仍然运行在系统中,随时准备再附着。) 那么,有没有一个”退出”键来完全退出screen呢?

据我所知,唯一正确的方式是关闭每个screen窗口(当然,给进程发信号的方法不在此列)。退出每一个正在运行的程序和shell,窗口也就关闭了。当最后一个运行在screen中的程序退出之后,screen自己也会知趣离开。

其它

screen的功能远超本文内容,但这些内容已经足够你开始使用screen了。你可以执行C-a ?来获取screen的命令列表。screen的man页面也包括了大量的信息。另外,如果你有问题,下面还有一些网络资源。

  • Yahoo GNU Screen Group 一个screen的非常活跃的邮件列表。许多博学的人才在上面挂着。
  • Sven Guckes’ Screen Page 另外一个概述页面,当然,内容要比本文丰富。
  • 官方screen主页 不需解释。这个页面上的细节比较少。
  • screen的manual 排版很好,章节分明。是一个很好的参考。重点看一下关于使用.screenrc配置screen的章节。
  • Screen FAQ 不是给新手用的,但是解决问题的很好的资源。

翻译对照表

  • detach: 分离
  • attach: 附着
  • reattach: 再附着
  • terminal: 终端
  • console: 控制台
  • multiplexer: 选择器
  • silence: 沉寂。本文中指的是一个程序执行完成或一直没有动静。

python programming visualization GPU scholarship algorithm data linux pdf foxit geometry math OpenGL zip D3 java vim makefile C++ gdb >>>> <<<<


pkg
node.js
bundle
Bunlde node.js app to standalone executable with pkg
2020-04-17 00:00:00 +0000
/programming/2020-04-17-bundle-node-js-app-to-standalone-executable-with-pkg/

	
	
tighervnc
ubuntu
Install tigervnc on Ubuntu18.04
2020-04-06 00:00:00 +0000
/techniques/2020-04-06-install-tigervnc-on-ubuntu-18.04/

	
	
go
qt
Usage of Go binding for Qt
2020-04-05 00:00:00 +0000
/programming/2020-04-05-usage-of-go-binding-for-qt/

	
	
docker
registry
web-UI
Setup a private docker registry v2 with web-ui
2020-04-04 00:00:00 +0000
/techniques/2020-04-04-setup-a-private-docker-registry/

	
	
jenkins
flask
continuous integration testing
docker
python
Continuous Integration Testing For Flask with Jenkins
2020-03-16 00:00:00 +0000
/programming/2020-03-16-jenkins-continuous-integration-testing-for-flask/

	
	
android
python
functional testing
uiautomator
Python-based ui-automator for Android
2020-03-15 00:00:00 +0000
/programming/2020-03-15-android-ui-automator-python/

	
	
sqlite3
linux
How to show Sqlite3 output as Man page table
2020-03-14 00:00:00 +0000
/techniques/2020-03-14-how-to-show-sqlite3-output-as-man-page-table/

	
	
gis
algorithm
Encoded Polyline Algorithm
2020-03-11 00:00:00 +0000
/programming/2020-03-11-encoded-polyline-algorithm/

	
	
你应该了解的所有wget命令
2015-09-26 00:00:00 +0000
/techniques/2015-09-26-all-the-wget-commands-you-should-know/

	
	
linux
gnome
GNOME 3 Usage
2015-02-17 00:00:00 +0000
/techniques/2015-02-17-gnome3-usage/

	
	
visualization
CFD
Usage of OpenFoam
2015-02-10 00:00:00 +0000
/scholarship/2015-02-10-openfoam-usage/

	
	
Script of converting tikz script to pdf file
2014-11-19 00:00:00 +0000
/techniques/2014-11-19-tikz-to-pdf-script/

	
	
linux
gimp
gimp使用笔记
2014-11-16 00:00:00 +0000
/techniques/2014-11-16-gimp-notes/

	
	
visualization
scholarship
draw critical points classification of planar system using tikz
2014-10-31 00:00:00 +0000
/scholarship/2014-10-31-planar-system-critical-points-with-tikz/

	
	
LaTeX
scholarship
Latex中bibtex的命名
2014-10-29 00:00:00 +0000
/scholarship/2014-10-29-latex-bibtex-author-name/

	
	
python
PyQt
programming
PyQt4 signal and slot Example
2014-10-19 00:00:00 +0000
/programming/2014-10-19-pyqt4-signal-slot-example/

	
	
programming
C++
Null Ostream Class in C++
2014-10-18 00:00:00 +0000
/programming/2014-10-18-cpp-null-ostream/

	
	
第一个GeoGebra应用
2014-10-09 00:00:00 +0000
/math/2014-10-09-first-geogebra-program/

	
	
linux
shell
shell用法集锦
2014-10-07 00:00:00 +0000
/techniques/2014-10-07-bash-notes/

	
	
swim
blog
游泳技术动画
2014-09-30 00:00:00 +0000
/blog/2014-09-30-swimming-animation/

	
	
scholarship
zotero
文献管理工具Zotero
2014-09-27 00:00:00 +0000
/scholarship/2014-09-27-Literature-Management-Software-Zotero/

	
	
programming
lisp
clojure
第一个clojure程序
2014-09-18 00:00:00 +0000
/programming/2014-09-18-the-first-clojure-program/

	
	
visualization
OpenGL
OpenGL使用技巧
2014-08-27 00:00:00 +0000
/scholarship/2014-08-27-opengl-utility/

	
	
python
crawler
用python来扒网页
2014-08-23 00:00:00 +0000
/programming/2014-08-23-web-scrap-with-python/

	
	
programming
Unicode
中文转码工具
2014-08-23 00:00:00 +0000
/programming/2014-08-23-unicode-conversion/

	
	
vim使用笔记
2014-08-22 00:00:00 +0000
/techniques/2014-08-22-vim-notes/

	
	
ImageMagick使用笔记
2014-08-21 00:00:00 +0000
/techniques/2014-08-21-ImageMagick-notes/

	
	
programming
C++
C++中打印指针
2014-08-17 00:00:00 +0000
/programming/2014-08-17-std-ostream-output-pointer-in-cplusplus/

	
	
programming
gdb
gdb笔记
2014-08-16 00:00:00 +0000
/programming/2014-08-16-gdb-notes/

	
	
programming
bit操作
2014-08-16 00:00:00 +0000
/programming/2014-08-16-bit-operation/

	
	
programming
C++
C++使用笔记
2014-08-12 00:00:00 +0000
/programming/2014-08-12-cpp-usage/

	
	
geometry
programming
python
平面三角形求交测试(Planar Triangles Intersection)
2014-08-07 00:00:00 +0000
/programming/2014-08-07-triangle-intersect/

	
	
vim
makefile
Makefile模板
2014-08-06 00:00:00 +0000
/techniques/2014-08-06-makefile-template/

	
	
programming
java
Java Usage
2014-08-03 00:00:00 +0000
/programming/2014-08-03-java-usage/

	
	
wxMaxima连不上maxima
2014-08-01 00:00:00 +0000
/techniques/2014-08-01-wxmaxima-not-connected-to-maxima/

	
	
用djvulibre将png图片转化为pdf
2014-07-27 00:00:00 +0000
/techniques/2014-07-27-convert-png-images-to-pdf-with-djvulibre/

	
	
用djvulibre来设置djvu文件的索引
2014-07-26 00:00:00 +0000
/techniques/2014-07-26-djvulibre-reset-outline/

	
	
python
programming
python的profile工具
2014-07-24 00:00:00 +0000
/programming/2014-07-24-python-profile/

	
	
隐函数定理
2014-07-22 00:00:00 +0000
/math/2014-07-22-Implicit-Function-Theorem/

	
	
google-chrome浏览器的标题栏字体渲染问题
2014-07-17 00:00:00 +0000
/techniques/2014-07-17-google-chrome-title-bar-font-rendering/

	
	
linux
备份文件Shell脚本
2014-07-14 00:00:00 +0000
/techniques/2014-07-14-linux-backup-shell-script/

	
	
Linux下将多个图像转换为pdf
2014-06-18 00:00:00 +0000
/techniques/2014-06-18-convert-multi-images-to-pdf/

	
	
D3
visualization
D3.js入门资料集锦
2014-05-24 00:00:00 +0000
/scholarship/2014-05-24-d3-js-tutorials/

	
	
linux
zip
python
Linux下zip文件解压乱码问题
2014-05-21 00:00:00 +0000
/techniques/2014-05-21-unzip-gbk-zip-file-in-linux/

	
	
关于Linux下有线网卡不能连接的问题
2014-05-14 00:00:00 +0000
/techniques/2014-05-14-about-r8169-ethernet-driver/

	
	
Linux下用wvdial为3G上网卡拨号
2014-05-04 00:00:00 +0000
/techniques/2014-05-04-3g-connection-with-wvdial/

	
	
algorithm
geometry
两个平面三角形的相交测试
2014-04-29 00:00:00 +0000
/scholarship/2014-04-29-intersections-between-two-2d-triangles/

	
	
使用另一个版本的glibc
2014-04-25 00:00:00 +0000
/techniques/2014-04-25-use-another-glibc-installation/

	
	
LaTeX使用方法集锦
2014-04-19 00:00:00 +0000
/techniques/2014-04-19-latex-usage/

	
	
scholarship
资源网站集锦
2014-04-16 00:00:00 +0000
/scholarship/2014-04-16-good-resource-website/

	
	
python
programming
Python使用问题集锦
2014-04-15 00:00:00 +0000
/programming/2014-04-15-python-usage/

	
	
修复pdf没有嵌入字体的问题
2014-04-07 00:00:00 +0000
/techniques/2014-04-07-repair-pdf-font-embedding-problem/

	
	
visualization
用VTK生成非结构化网格上的矢量场
2014-04-03 00:00:00 +0000
/scholarship/2014-04-03-use-vtk-create-vector-field-on-unstructured-grid/

	
	
algorithm
visualization
geometry
光线-三角形求交测试算法[译]
2014-04-03 00:00:00 +0000
/scholarship/2014-04-03-ray-triangle-intersection-tests-for-dummies/

	
	
OpenGL
python
programming
Python下写OpenGL代码示例
2014-04-03 00:00:00 +0000
/programming/2014-04-03-python-opengl-sample/

	
	
使用tikz绘制函数
2014-03-30 00:00:00 +0000
/techniques/2014-03-30-use-tikz-to-plot-function/

	
	
使用maxima求解非线性方程组
2014-03-21 00:00:00 +0000
/techniques/2014-03-21-use-maxima-to-solve-non-linear-system/

	
	
linux
在Linux下为笔记本添加两指左右滚动功能
2014-03-11 00:00:00 +0000
/techniques/2014-03-11-add-horizontal-two-finger-scroll/

	
	
Linux下常用工具
2014-03-08 00:00:00 +0000
/techniques/2014-03-08-usual-life-linux-tools/

	
	
Linux下使用github
2014-03-08 00:00:00 +0000
/techniques/2014-03-08-how-to-use-github/

	
	
git使用笔记
2014-03-08 00:00:00 +0000
/techniques/2014-03-08-git-usage/

	
	
LaTeX笔记(texlive)
2014-03-06 00:00:00 +0000
/techniques/2014-03-06-latex-notes/

	
	
geometry
visualization
几种基本几何预测
2014-03-01 00:00:00 +0000
/scholarship/2014-03-01-geometric-predicates/

	
	
math
visualization
geometry
单纯复形(Simplicial Complexes)[译]
2014-02-27 00:00:00 +0000
/scholarship/2014-02-27-simplicial-complexes/

	
	
linux
一个用于寻找文件,并便于打开文件的脚本
2014-02-22 00:00:00 +0000
/techniques/2014-02-22-a-script-for-find-and-open-file/

	
	
linux
清理Linux中的不用内存或缓存
2014-02-21 00:00:00 +0000
/techniques/2014-02-21-free-linux-memory/

	
	
visualization
geometry
形状指数(shape index)
2014-02-20 00:00:00 +0000
/scholarship/2014-02-20-shape-index/

	
	
用wget下载C++的手册
2014-02-10 00:00:00 +0000
/techniques/2014-02-10-download-cplusplus-reference/

	
	
linux
pdf
foxit
在Linux下使用wine+foxit
2014-02-08 00:00:00 +0000
/techniques/2014-02-08-using-foxit-in-linux/

	
	
在Bash的输入循环中使用readline和历史记录
2014-02-06 00:00:00 +0000
/techniques/2014-02-06-completion-and-history-in-bash-read-loop/

	
	
visualization
data
可视化数据集
2014-01-07 00:00:00 +0000
/scholarship/2014-01-07-visualization-dataset-collection/

	
	
关于几种窗口系统的透明效果
2014-01-06 00:00:00 +0000
/techniques/2014-01-06-transparent-window/

	
	
使用淘宝提供的Ruby源
2014-01-06 00:00:00 +0000
/techniques/2014-01-06-taobao-gems/

	
	
函数的临界点上的海森(Hessian)矩阵的含义[译]
2013-12-29 00:00:00 +0000
/math/2013-12-29-Meaning-of-the-Hessian-of-a-function-in-a-critical-point/

	
	
algorithm
visualization
层次集方法讲稿[译]
2013-12-25 00:00:00 +0000
/scholarship/2013-12-25-the-level-set-method-lecture-notes/

	
	
visualization
algorithm
层次集方法(Level Set Method) -- 解释[译]
2013-12-24 00:00:00 +0000
/scholarship/2013-12-24-level-set-method-explanation/

	
	
scholarship
微软的学术搜索引擎还是很好用的
2013-12-17 00:00:00 +0000
/scholarship/2013-12-17-academical-search-with-microsoft-search-engine/

	
	
GNU screen 保存会话
2013-12-12 00:00:00 +0000
/techniques/2013-12-12-gnu-screen-save-session/

	
	
GNU Screen--介绍和初学者指南[译]
2013-12-04 00:00:00 +0000
/techniques/2013-12-04-gnu-screen-an-introduction-and-beginners-tutorial/

	
	
visualization
GPU
GPU Gems - 第39章 基于纹理的体绘制技术[译]
2013-12-04 00:00:00 +0000
/scholarship/2013-12-04-gpugems-ch39-texture-based-volume-rendering/

	
	
MathJax使用示例
2013-12-03 00:00:00 +0000
/techniques/2013-12-03-mathjax-example/

	
	
Jekyll中使用MathJax
2013-12-03 00:00:00 +0000
/techniques/2013-12-03-jekyll-using-mathjax/

	
	
visualization
GPU
GPU Gems - 第17章 环境光遮蔽[译]
2013-12-01 00:00:00 +0000
/scholarship/2013-12-01-gpugems-ch17-ambient-occlusion/

	
	
python
programming
python解释器中的自动补全
2013-11-30 00:00:00 +0000
/programming/2013-11-30-python-interpreter-autocomplete/

	
	
Github建站过程
2013-11-29 00:00:00 +0000
/techniques/2013-11-29-build-a-github-website/

	
	
python
programming
最简单的python服务器
2013-11-29 00:00:00 +0000
/programming/2013-11-29-python-simple-server/