黑基网 首页 服务器 Linux 查看内容

Linux学习:让进程在后台运行的几种方法

2017-6-13 00:20| 投稿: heilong916 |来自: 互联网

摘要: 我们在使用Linux的时候,经常会用到ssh/telnet登录远程的服务器,有可能因为网络的不稳定导致中途连接失败,造成任务没有执行完。如何让命令不受本地终端窗口/网络断开的影响呢?我们大家都知道,当终端被关闭或者网 ...

我们在使用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 信号的影响了。

小编推荐:欲学习电脑技术、系统维护、网络管理、编程开发和安全攻防等高端IT技术,请 点击这里 注册黑基账号,公开课频道价值万元IT培训教程免费学,让您少走弯路、事半功倍,好工作升职加薪!

本文出自:http://www.toutiao.com/a6430731779054240002/

免责声明:本文由投稿者转载自互联网,版权归原作者所有,文中所述不代表本站观点,若有侵权或转载等不当之处请联系我们处理,让我们一起为维护良好的互联网秩序而努力!联系方式见网站首页右下角。


鲜花

握手

雷人

路过

鸡蛋

相关阅读

发表评论

最新评论

引用 游客 2017-11-29 14:32
50P** http://www.LnAJ7K8QSpfMO2wQ8gO.com

查看全部评论(1)


新出炉

返回顶部