我们在使用Linux的时候,经常会用到ssh/telnet登录远程的服务器,有可能因为网络的不稳定导致中途连接失败,造成任务没有执行完。 如何让命令不受本地终端窗口/网络断开的影响呢?我们大家都知道,当终端被关闭或者网络断开了,运行的进程就会收到SIGHUP(Signal Hangup信号),从而关闭所有的子进程。
因此我们解决的方法就可以从两方面着手,一个就是让进程忽略SIGHUP信号,另外一个就是让进程不属于此终端的子进程。下面我们来一一介绍吧。 1.nohup nohup 忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。nohup加上运行的 command命令,添加 & ( 表示“and”的符号)到命令的尾部,来看看nohup的帮助信息。
nohup 帮助信息 如果不将 nohup 命令的输出重定向,输出将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加,那么 COMMAND参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。 nohup 命令执行 也可以通过">filename 2>&1"来更改缺省的重定向文件名。或者直接"> /dev/null 2>&1 &"重定向到/dev/null,不记录日志。 2.setsid nohup是使进程不接收SIGHUP信号来阻止进程kill掉。那么是不是可以让当前运行的进程不属于当前运行的terminal呢,setsid命令就能实现这个功能,它可以使进程运行于一个新的session中,那么当前的terminal收到SIGHUP并不影响已经改变了session的进程。 具体的解释如下,setsid调用成功后,进程成为新的会话组长和新的进程组长,并与原来的登录会话和进程组脱离。由于会话过程对控制终端的独占性,进程同时与控制终端脱离。 setsid 帮助信息 setsid使用很方便,只要在命令前加上setsid即可。参加如下执行示例: setsid执行示例 3. ()+& 将一个或多个命名包含在“()”中就能让这些命令在子 shell 中运行中。将"&"也放入“()”内之后,我们就会发现所提交的作业并不在作业列表中,效果基本上和setsid相同。 (command &)执行示例 从上例中可以看出,新提交的进程的父 ID(PPID)为1(init 进程的 PID),并不是当前终端的进程 ID(8478)。因此并不属于当前终端的子进程,从而也就不会受到当前终端的 HUP 信号的影响了。 |
| 本文出处: http://www.toutiao.com/a6430731779054240002/ |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|