2024年5月30日发(作者:)

SecureCRT异常关闭,后台进程中断原因及解决办法

2011-05-23 10:56:54| 分类: Linux | 标签:screen nohup |字号大中小 订阅

我经常需要SecureCRT ssh远程登录到 Linux 服务器,做一些事情,比如启动某一个进程让其长时间运行,

通常情况下都是为每一个这样的任务开一个远程终端窗口,因为他们执行的时间太长了。在此期间如果出现非

正常关闭ssh连接(模拟突然掉电或者断网,未来得及退出ssh,或者ssh仍然连接,直接关闭终端

SecureCRT),这个任务就会被杀掉,一切半途而废了。

原因:

当登录Linux时,系统会分配给登录用户一个终端(Session)。在这个终端运行的所有程序,包括前

台进程组和后台进程组,一般都属于这个 Session。当用户退出Linux登录时,系统会给这个session所关联

的所有进程发送SIGHUP信号,前台进程组和后台对终端输出的进程将会收到SIGHUP信号。这个信号的默

认操作为终止进程,因此前台进程组和后台有终端输出的进程就会中止。

解决办法:

方法一:使用screen

Screen工具是一个终端多路转接器,在本质上,这意味着我们能够使用一个单一的终端窗口运行多终端的应

用。

screen命令介绍

1. $:screen 创建一个screen

2. $:screen -ls 显示所有的screen会话

3. $:screen -d 脱离当前screen ,返回正常shell

4. $:screen -r 6361(作者注:huihuaID,用session -ls可以得到) 进入指定screen

举例:

1. 创建screen会话。

(1) 直接在命令行键入screen命令

[root@tivf06 ~]# screen

Screen将创建一个执行shell的全屏窗口。你可以执行任意shell程序,就像在ssh窗口中那样。在该

窗口中键入exit 退出该窗口,如果这是该screen会话的唯一窗口,该screen会话退出,否则screen自动切

换到前一个窗口。

[root@tivf06 ~]# vi test.c

(2)Screen命令后跟要执行的程序。

[root@tivf06 ~]# screen vi test.c

Screen创建一个执行vi test.c的单窗口会话,退出vi将退出该窗口/会话。

以上两种方式都创建新的screen会话。我们还可以在一个已有screen会话中创建新的窗口。在当前

screen窗口中键 入 C-a c,即Ctrl键+a键,之后再按下c键,screen 在该会话内生成一个新的窗口并切换到

该窗口。

2. 想暂时退出做点别的事情,比如出去散散步,那么在screen窗口键入C-a d(即Ctrl键+a键,之后再按下d

键),Screen 会给出detached提示:

暂时中断会话

3. 半个小时之后回来了,找到该screen会话:

[root@tivf06 ~]# screen -ls

There is a screen on: 06 (Detached) 1 Socket in /tmp/screens/S-root.

4. 重新连接会话:

[root@tivf06 ~]# screen -r 16582

给screen发送命令使用了特殊的键组合C-a。这是因为我们在键盘上键入的信息是直接发送给当前screen窗

口,必须用其他方式向 screen窗口管理器发出命令,默认情况下,screen接收以C-a开始的命令。这种命令

形式在screen中叫做键绑定(key binding),C-a叫做命令字符(command character)。

可以通过C-a ?来查看所有的键绑定,常用的键绑定有:

C-a ? 显示所有键绑定信息

C-a w 显示所有窗口列表

C-a C-a 切换到之前显示的窗口

C-a c 创建一个新的运行shell的窗口并切换到该窗口

C-a n 切换到下一个窗口

C-a p 切换到前一个窗口(与C-a n相对)

C-a 0..9 切换到窗口0..9

C-a a 发送 C-a到当前窗口

C-a d 暂时断开screen会话

C-a k 杀掉当前窗口

C-a [ 进入拷贝/回滚模式

方法二:使用nohup命令

用途:不挂断地运行命令。

语法:nohup Command [ Arg ... ] [ & ]

描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信

号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示"and"的符号)

到命令的尾部。

无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 文件中。如果当前

目录的 文件不可写,输出重定向到 $HOME/ 文件中。如果没有文件能创建或打开以用于

追加,那么 Command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错

误的所有输出作为标准输出重定向到相同的文件描述符。

退出状态:该命令返回下列出口值:

126 可以查找但不能调用 Command 参数指定的命令。

127 nohup 命令发生错误或不能查找由 Command 参数指定的命令。

否则,nohup 命令的退出状态是 Command 参数指定命令的退出状态。

举例:

比如我们有个需要在后台运行,并且希望在后台能够一直运行,那么就使用nohup:

[root@tivf06 ~]# nohup /root/ &

在shell中回车后提示:

[root@tivf06 ~]# appending output to

如果想要监控标准输出可以使用:

[root@tivf06 ~]# tail -f

当shell中提示了nohup成功后还需要按终端上键盘任意键退回到shell输入命令窗口,然后通过在shell

中输入exit来退出终端。