山牧人 發表於 2023-10-25 00:00:00

linux小技巧之利用screen管理你的远程会话

<p>
        <span><strong>前言</strong></span></p>
<p>
        大家是不是经常需要 ssh 或者 telent 远程登录到 linux 服务器?是不是经常为一些长时间运行的任务而头疼,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为他们执行的时间太长了。必须等待它执行完毕,在此期间可不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了。</p>
<p>
        <span><strong>元凶:sighup 信号</strong></span></p>
<p>
        让我们来看看为什么关掉窗口/断开连接会使得正在运行的程序死掉。</p>
<p>
        <strong>在linux/unix中,有这样几个概念:</strong></p>
<ul>
<li>
                进程组(process group):一个或多个进程的集合,每一个进程组有唯一一个进程组id,即进程组长进程的id。</li>
        <li>
                会话期(session):一个或多个进程组的集合,有唯一一个会话期首进程(session leader)。会话期id为首进程的id。</li>
        <li>
                会话期可以有一个单独的控制终端(controlling terminal)。与控制终端连接的会话期首进程叫做控制进程(controlling process)。当前与终端交互的进程称为前台进程组。其余进程组称为后台进程组。</li>
</ul>
<p>
        <strong>根据posix.1定义:</strong></p>
<ul>
<li>
                挂断信号(sighup)默认的动作是终止程序。</li>
        <li>
                当终端接口检测到网络连接断开,将挂断信号发送给控制进程(会话期首进程)。</li>
        <li>
                如果会话期首进程终止,则该信号发送到该会话期前台进程组。</li>
        <li>
                一个进程退出导致一个孤儿进程组中产生时,如果任意一个孤儿进程组进程处于stop状态,发送sighup和sigcont信号到该进程组中所有进程。</li>
</ul>
<p>
        因此当网络断开或终端窗口关闭后,控制进程收到sighup信号退出,会导致该会话期内其他进程退出。</p>
<p>
        我们来看一个例子。打开两个ssh终端窗口,在其中一个运行top命令。</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_447727">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain"></code><code class="bash comments"># top</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        在另一个终端窗口,找到top的进程id为5180,其父进程id为5128,即登录shell。</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_82562">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain"></code><code class="bash comments"># ps -ef|grep top</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash plain">root 5180 5128 0 01:03 pts</code><code class="bash plain">/0</code> <code class="bash plain">00:00:02 </code><code class="bash functions">top</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="bash plain">root 5857 3672 0 01:12 pts</code><code class="bash plain">/2</code> <code class="bash plain">00:00:00 </code><code class="bash functions">grep</code> <code class="bash functions">top</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        使用pstree命令可以更清楚地看到这个关系:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_601863">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain"></code><code class="bash comments"># pstree -h 5180|grep top</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash plain">|-sshd-+-sshd---</code><code class="bash functions">bash</code><code class="bash plain">---</code><code class="bash functions">top</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        使用ps-xj命令可以看到,登录shell(pid 5128)和top在同一个会话期,shell为会话期首进程,所在进程组pgid为5128,top所在进程组pgid为5180,为前台进程组。</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_81310">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain"></code><code class="bash comments"># ps -xj|grep 5128</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash spaces"> </code><code class="bash plain">5126 5128 5128 5128 pts</code><code class="bash plain">/0</code> <code class="bash plain">5180 s 0 0:00 -</code><code class="bash functions">bash</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="bash spaces"> </code><code class="bash plain">5128 5180 5180 5128 pts</code><code class="bash plain">/0</code> <code class="bash plain">5180 s 0 0:50 </code><code class="bash functions">top</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="bash spaces"> </code><code class="bash plain">3672 18095 18094 3672 pts</code><code class="bash plain">/2</code> <code class="bash plain">18094 s 0 0:00 </code><code class="bash functions">grep</code> <code class="bash plain">5128</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        关闭第一个ssh窗口,在另一个窗口中可以看到top也被杀掉了。</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_713292">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain"></code><code class="bash comments"># ps -ef|grep 5128</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash plain">root 18699 3672 0 04:35 pts</code><code class="bash plain">/2</code> <code class="bash plain">00:00:00 </code><code class="bash functions">grep</code> <code class="bash plain">5128</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        如果我们可以忽略sighup信号,关掉窗口应该就不会影响程序的运行了。nohup命令可以达到这个目的,如果程序的标准输出/标准错误是终端,nohup默认将其重定向到nohup.out文件。值得注意的是nohup命令只是使得程序忽略sighup信号,还需要使用标记&amp;把它放在后台运行。</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_3558">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash functions">nohup</code> <code class="bash plain">&lt;</code><code class="bash functions">command</code><code class="bash plain">&gt; &amp;</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        虽然nohup很容易使用,但还是比较“简陋”的,对于简单的命令能够应付过来,对于复杂的需要人机交互的任务就麻烦了。<br>
        其实我们可以使用一个更为强大的实用程序screen。流行的linux发行版(例如red hat enterprise linux 4)通常会自带screen实用程序,如果没有的话,可以从gnu screen的官方网站下载。</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_367776">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain"></code><code class="bash comments"># rpm -qa|grep screen</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash plain">xscreensaver-4.18-5.rhel4.11</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="bash functions">screen</code><code class="bash plain">-4.0.2-5</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <span><strong>开始使用screen</strong></span></p>
<p>
        简单来说,screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。screen中有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的telnet/ssh连接窗口那样。在screen中创建一个新的窗口有这样几种方式:</p>
<p>
        <strong>1.直接在命令行键入screen命令</strong></p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_539558">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain"></code><code class="bash comments"># screen</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        screen将创建一个执行shell的全屏窗口。你可以执行任意shell程序,就像在ssh窗口中那样。在该窗口中键入exit退出该窗口,如果这是该screen会话的唯一窗口,该screen会话退出,否则screen自动切换到前一个窗口。</p>
<p>
        <strong>2.screen命令后跟你要执行的程序。</strong></p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_765716">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain"></code><code class="bash comments"># screen vi test.c</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        screen创建一个执行vi test.c的单窗口会话,退出vi将退出该窗口/会话。</p>
<p>
        <strong>3.以上两种方式都创建新的screen会话。</strong></p>
<p>
        我们还可以在一个已有screen会话中创建新的窗口。在当前screen窗口中键入c-a c,即ctrl键+a键,之后再按下c键,screen 在该会话内生成一个新的窗口并切换到该窗口。</p>
<p>
        screen还有更高级的功能。你可以不中断screen窗口中程序的运行而暂时断开(detach)screen会话,并在随后时间重新连接(attach)该会话,重新控制各窗口中运行的程序。例如,我们打开一个screen窗口编辑/tmp/abc文件:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_485261">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain"></code><code class="bash comments"># screen vi /tmp/abc</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        之后我们想暂时退出做点别的事情,比如出去散散步,那么在screen窗口键入c-a d,screen会给出detached提示:</p>
<p>
        <span><strong>暂时中断会话</strong></span></p>
<p>
        <img title="linux小技巧之利用screen管理你的远程会话" alt="linux小技巧之利用screen管理你的远程会话" src="https://zhuji.jb51.net/uploads/img/202305/c7221ed293c9b4caf65cf3246aacfdd5.jpg"></p>
<p>
        半个小时之后回来了,找到该screen会话:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_210063">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain"></code><code class="bash comments"># screen -ls</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash plain">there is a </code><code class="bash functions">screen</code> <code class="bash plain">on:</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="bash spaces"> </code><code class="bash plain">16582.pts-1.tivf06 (detached)</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="bash plain">1 socket </code><code class="bash keyword">in</code> <code class="bash plain">/tmp/screens/s-root</code><code class="bash plain">.</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        重新连接会话:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_213175">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain"></code><code class="bash comments"># screen -r 16582</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        看看出现什么了,太棒了,一切都在。继续干吧。</p>
<p>
        你可能注意到给screen发送命令使用了特殊的键组合c-a。这是因为我们在键盘上键入的信息是直接发送给当前screen窗口,必须用其他方式向screen窗口管理器发出命令,默认情况下,screen接收以c-a开始的命令。这种命令形式在screen中叫做键绑定(key binding),c-a叫做命令字符(command character)。</p>
<p>
        可以通过c-a ?来查看所有的键绑定,常用的键绑定有:</p>
<p>
         </p>
<table border="0" cellpadding="0" cellspacing="0" summary="">
<thead xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"><tr>
<th scope="row">
                                c-a ?</th>
                        <td>
                                显示所有键绑定信息</td>
                </tr></thead>
<tbody xmlns:xsi="http://www.w3.org/2001/xmlschema-instance">
<tr>
<th scope="row">
                                c-a w</th>
                        <td>
                                显示所有窗口列表</td>
                </tr>
<tr>
<th scope="row">
                                c-a c-a</th>
                        <td>
                                切换到之前显示的窗口</td>
                </tr>
<tr>
<th scope="row">
                                c-a c</th>
                        <td>
                                创建一个新的运行shell的窗口并切换到该窗口</td>
                </tr>
<tr>
<th scope="row">
                                c-a n</th>
                        <td>
                                切换到下一个窗口</td>
                </tr>
<tr>
<th scope="row">
                                c-a p</th>
                        <td>
                                切换到前一个窗口(与c-a n相对)</td>
                </tr>
<tr>
<th scope="row">
                                c-a 0..9</th>
                        <td>
                                切换到窗口0..9</td>
                </tr>
<tr>
<th scope="row">
                                c-a a</th>
                        <td>
                                发送 c-a到当前窗口</td>
                </tr>
<tr>
<th scope="row">
                                c-a d</th>
                        <td>
                                暂时断开screen会话</td>
                </tr>
<tr>
<th scope="row">
                                c-a k</th>
                        <td>
                                杀掉当前窗口</td>
                </tr>
<tr>
<th scope="row">
                                c-a [</th>
                        <td>
                                进入拷贝/回滚模式</td>
                </tr>
</tbody>
</table>
<p>
         </p>
<p>
        <span><strong>screen常用选项</strong></span></p>
<p>
        使用键绑定c-a ?命令可以看到, 默认的命令字符(command key)为c-a,转义c-a(literal ^a)的字符为a:</p>
<p>
        <strong>screen 常用选项</strong></p>
<p>
        <img title="linux小技巧之利用screen管理你的远程会话" alt="linux小技巧之利用screen管理你的远程会话" src="https://zhuji.jb51.net/uploads/img/202305/f68d8541922c45283c67f94663fe828a.jpg"></p>
<p>
        因为screen把c-a看作是screen命令的开始,所以如果你想要screen窗口接收到c-a字符,就要输入c-a a。screen也允许你使用-e选项设置自己的命令字符和转义字符,其格式为:</p>
<p>
        -exy x为命令字符,y为转义命令字符的字符</p>
<p>
        下面命令启动的screen会话指定了命令字符为c-t,转义c-t的字符为t,通过c-t ?命令可以看到该变化。</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_231504">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain"></code><code class="bash comments"># screen -e^tt</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <strong>自定义命令字符和转义字符</strong></p>
<p>
        <img title="linux小技巧之利用screen管理你的远程会话" alt="linux小技巧之利用screen管理你的远程会话" src="https://zhuji.jb51.net/uploads/img/202305/6fda291a659d1ffa62abb87568f53e81.jpg"></p>
<p>
        其他常用的命令选项有:</p>
<p>
         </p>
<table border="0" cellpadding="0" cellspacing="0" summary="">
<thead xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"><tr>
<th scope="row">
                                -c file</th>
                        <td>
                                使用配置文件file,而不使用默认的$home/.screenrc</td>
                </tr></thead>
<tbody xmlns:xsi="http://www.w3.org/2001/xmlschema-instance">
<tr>
<th scope="row">
                                -d|-d </th>
                        <td>
                                不开启新的screen会话,而是断开其他正在运行的screen会话</td>
                </tr>
<tr>
<th scope="row">
                                -h num</th>
                        <td>
                                指定历史回滚缓冲区大小为num行</td>
                </tr>
<tr>
<th scope="row">
                                -list|-ls</th>
                        <td>
                                列出现有screen会话,格式为pid.tty.host</td>
                </tr>
<tr>
<th scope="row">
                                -d -m</th>
                        <td>
                                启动一个开始就处于断开模式的会话</td>
                </tr>
<tr>
<th scope="row">
                                -r sessionowner/ </th>
                        <td>
                                重新连接一个断开的会话。多用户模式下连接到其他用户screen会话需要指定sessionowner,需要setuid-root权限</td>
                </tr>
<tr>
<th scope="row">
                                -s sessionname</th>
                        <td>
                                创建screen会话时为会话指定一个名字</td>
                </tr>
<tr>
<th scope="row">
                                -v</th>
                        <td>
                                显示screen版本信息</td>
                </tr>
<tr>
<th scope="row">
                                -wipe </th>
                        <td>
                                同-list,但删掉那些无法连接的会话</td>
                </tr>
</tbody>
</table>
<p>
         </p>
<p border="0" cellpadding="0" cellspacing="0" summary="">
        下例显示当前有两个处于detached状态的screen会话,你可以使用screen -r &lt;screen_pid&gt;重新连接上:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_857298">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain"></code><code class="bash comments"># screen –ls</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash plain">there are screens on:</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="bash spaces"> </code><code class="bash plain">8736.pts-1.tivf18 (detached)</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="bash spaces"> </code><code class="bash plain">8462.pts-0.tivf18 (detached)</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="bash plain">2 sockets </code><code class="bash keyword">in</code> <code class="bash plain">/root/</code><code class="bash plain">.</code><code class="bash functions">screen</code><code class="bash plain">.</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                         </div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="bash plain"></code><code class="bash comments"># screen –r 8736</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        如果由于某种原因其中一个会话死掉了(例如人为杀掉该会话),这时screen -list会显示该会话为dead状态。使用screen -wipe命令清除该会话:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_245309">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                        <div class="line number14 index13 alt1">
                                                                14</div>
                                                        <div class="line number15 index14 alt2">
                                                                15</div>
                                                        <div class="line number16 index15 alt1">
                                                                16</div>
                                                        <div class="line number17 index16 alt2">
                                                                17</div>
                                                        <div class="line number18 index17 alt1">
                                                                18</div>
                                                        <div class="line number19 index18 alt2">
                                                                19</div>
                                                        <div class="line number20 index19 alt1">
                                                                20</div>
                                                        <div class="line number21 index20 alt2">
                                                                21</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain"></code><code class="bash comments"># kill -9 8462</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash plain"></code><code class="bash comments"># screen -ls </code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="bash plain">there are screens on:</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="bash spaces"> </code><code class="bash plain">8736.pts-1.tivf18 (detached)</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="bash spaces"> </code><code class="bash plain">8462.pts-0.tivf18 (dead ???)</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="bash plain">remove dead screens with </code><code class="bash string">'screen -wipe'</code><code class="bash plain">.</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="bash plain">2 sockets </code><code class="bash keyword">in</code> <code class="bash plain">/root/</code><code class="bash plain">.</code><code class="bash functions">screen</code><code class="bash plain">.</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                         </div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="bash plain"></code><code class="bash comments"># screen -wipe</code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="bash plain">there are screens on:</code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="bash spaces"> </code><code class="bash plain">8736.pts-1.tivf18 (detached)</code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="bash spaces"> </code><code class="bash plain">8462.pts-0.tivf18 (removed)</code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="bash plain">1 socket wiped out.</code>
</div>
                                                                <div class="line number14 index13 alt1">
                                                                        <code class="bash plain">1 socket </code><code class="bash keyword">in</code> <code class="bash plain">/root/</code><code class="bash plain">.</code><code class="bash functions">screen</code><code class="bash plain">.</code>
</div>
                                                                <div class="line number15 index14 alt2">
                                                                         </div>
                                                                <div class="line number16 index15 alt1">
                                                                        <code class="bash plain"></code><code class="bash comments"># screen -ls </code>
</div>
                                                                <div class="line number17 index16 alt2">
                                                                        <code class="bash plain">there is a </code><code class="bash functions">screen</code> <code class="bash plain">on:</code>
</div>
                                                                <div class="line number18 index17 alt1">
                                                                        <code class="bash spaces"> </code><code class="bash plain">8736.pts-1.tivf18 (detached)</code>
</div>
                                                                <div class="line number19 index18 alt2">
                                                                        <code class="bash plain">1 socket </code><code class="bash keyword">in</code> <code class="bash plain">/root/</code><code class="bash plain">.</code><code class="bash functions">screen</code><code class="bash plain">.</code>
</div>
                                                                <div class="line number20 index19 alt1">
                                                                         </div>
                                                                <div class="line number21 index20 alt2">
                                                                        <code class="bash plain"></code><code class="bash comments">#</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        -d –m 选项是一对很有意思的搭档。他们启动一个开始就处于断开模式的会话。你可以在随后需要的时候连接上该会话。有时候这是一个很有用的功能,比如我们可以使用它调试后台程序。该选项一个更常用的搭配是:-dms sessionname<br>
        启动一个初始状态断开的screen会话:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterps" id="highlighter_379992">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="ps plain"></code><code class="ps comments"># screen -dms mygdb gdb execlp_test</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        连接该会话:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_393520">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain"></code><code class="bash comments"># screen -r mygdb</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <span><strong>管理你的远程会话</strong></span></p>
<p>
        先来看看如何使用screen解决sighup问题,比如现在我们要ftp传输一个大文件。如果按老的办法,ssh登录到系统,直接ftp命令开始传输,之后。。如果网络速度还可以,恭喜你,不用等太长时间了;如果网络不好,老老实实等着吧,只能传输完毕再断开ssh连接了。让我们使用screen来试试。</p>
<p>
        ssh登录到系统,在命令行键入screen。</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_794642">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain"></code><code class="bash comments"># screen</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        在screen shell窗口中输入ftp命令,登录,开始传输。不愿意等了?ok,在窗口中键入c-a d:</p>
<p>
        <strong>管理你的远程会话</strong></p>
<p>
        <img title="linux小技巧之利用screen管理你的远程会话" alt="linux小技巧之利用screen管理你的远程会话" src="https://zhuji.jb51.net/uploads/img/202305/bff7bb6c7aee2da99687f0be5582e2bd.jpg"></p>
<p>
        然后。。退出ssh登录?随你怎样,只要别杀掉screen会话。</p>
<p>
        是不是很方便?更进一步,其实我们可以利用screen这种功能来管理你的远程会话,保存你所有的工作内容。你是不是每次登录到系统都要开很多窗口,然后每天都要重复打开关闭这些窗口?让screen来帮你“保存”吧,你只需要打开一个ssh窗口,创建需要的screen窗口,退出的时候c-a d“保存”你的工作,下次登录后直接screen -r &lt;screen_pid&gt;就可以了。</p>
<p>
        最好能给每个窗口起一个名字,这样好记些。使用c-a a给窗口起名字。使用c-a w可以看到这些窗口名字,可能名字出现的位置不同。使用putty:</p>
<p>
        <strong>putty</strong></p>
<p>
        <img title="linux小技巧之利用screen管理你的远程会话" alt="linux小技巧之利用screen管理你的远程会话" src="https://zhuji.jb51.net/uploads/img/202305/951d98f52961a8ef2a1867ef3b1967a5.jpg"></p>
<p>
        使用telnet:</p>
<p>
        <strong>telnet</strong></p>
<p>
        <img title="linux小技巧之利用screen管理你的远程会话" alt="linux小技巧之利用screen管理你的远程会话" src="https://zhuji.jb51.net/uploads/img/202305/72e40c0f640f8475b58cc2d4a152d1ca.jpg"></p>
<p>
        <span><strong>更多screen功能</strong></span></p>
<p>
        screen提供了丰富强大的定制功能。你可以在screen的默认两级配置文件/etc/screenrc和$home/.screenrc中指定更多,例如设定screen选项,定制绑定键,设定screen会话自启动窗口,启用多用户模式,定制用户访问权限控制等等。如果你愿意的话,也可以自己指定screen配置文件。</p>
<p>
        以多用户功能为例,screen默认是以单用户模式运行的,你需要在配置文件中指定multiuser on 来打开多用户模式,通过acl*(acladd,acldel,aclchg...)命令,你可以灵活配置其他用户访问你的screen会话。更多配置文件内容请参考screen的man页。</p>
<p>
        <span><strong>总结</strong></span></p>
<p>
        以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。</p>
<p>
        原文链接:https://www.ibm.com/developerworks/cn/linux/l-cn-screen/</p>
頁: [1]
查看完整版本: linux小技巧之利用screen管理你的远程会话