原因:当登录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: 16582.pts-1.tivf06 (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 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。
退出状态:该命令返回下列出口值:
126 可以查找但不能调用 Command 参数指定的命令。
127 nohup 命令发生错误或不能查找由 Command 参数指定的命令。
否则,nohup 命令的退出状态是 Command 参数指定命令的退出状态。
举例:
比如我们有个start.sh需要在后台运行,并且希望在后台能够一直运行,那么就使用nohup:
[root@tivf06 ~]# nohup /root/start.sh &
在shell中回车后提示:
[root@tivf06 ~]# appending output to nohup.out
如果想要监控标准输出可以使用:
[root@tivf06 ~]# tail -f nohup.out
当shell中提示了nohup成功后还需要按终端上键盘任意键退回到shell输入命令窗口,然后通过在shell中输入exit来退出终端。