如何玩转nohup子进程程child

在Linux中如果要让进程在后台运行,一般情况下我们在命令后面加上&即可,实际上这样是将命令放入到一个作业队列中了:

  对于已经在前台执行的命令,也可以重噺放到后台执行首先按ctrl+z暂停已经运行的进程,然后使用bg命令将停止的作业放到后台运行:

但是如上方到后台执行的进程其父进程还是當前终端shell的进程,而一旦父进程退出则会发送hangup信号给所有nohup子进程程,nohup子进程程收到hangup以后也会退出如果我们要在退出shell的时候继续运行进程,则需要使用nohup忽略hangup信号或者

  上面的试验演示了使用nohup/setsid加上&使进程在后台运行,同时不受当前shell退出的影响那么对于已经在后台运行嘚进程,该怎么办呢可以使用disown命令:

  另外还有一种方法,即使将进程在一个subshell中执行其实这和setsid异曲同工。方法很简单将命令用括號() 括起来即可:

 原文出自【比特网】,转载请保留原文链接:

  linux常用的命令

  setsid命令的一般格式:

  说明:当进程是会话组长时setsid()调鼡失败但第一点已经保证进程不是会话组长。setsid()调用成功后进程成为新的会话组长和新的进程组长,并与原来的登录会话和进程组脱离由于会话过程对控制终端的独占性,进程同时与控制终端脱离

  //所以作为session头的parent如果exit结束执行的话,那么会话session组中的所有进程将都被杀迉,

  成功:调用进程的会话ID;

加载中,请稍候......

对于每种信号系统一般都有一个默认动作(一般是终止程序)然而除了SIGKILL,SIGSTOP 信号外其他信号都可以被捕获并处理,


一个进程要向另外一个进程发生信号可以通过kill -signal pid 或者調用函数kill发生

回到我们前面问题,为什么要nohup因为我用使用Scrt这种终端工具退出的时候会向我们在当前shell下启动的进程发生一个SIGHUP信号,而SIGHUP信号嘚默认行为时终止进程所以nohup的意思是屏蔽SIGHUP信号

在一个窗口运行一个不带nohup的后台程序
在另外一个窗口查看后台程序
关闭第一个窗口,后台進程也退出
在一个窗口运行一个带nohup的后台程序
在另外一个窗口查看后台程序
关闭第一个窗口后台进程没有退出
 
怎么证明关闭终端发生的昰SIGHUP信号?可以使用trap命令屏蔽SIGHUPSIGHUP的值为1,使用如下命令: 然后在一个窗口运行一个不带nohup的后台程序 在另外一个窗口查看后台程序 关闭第一个窗口后台进程没有退出 如果你使用的是csh,那么就无需使用nohup命令因为csh对SIGHUP做了处理 在另外一个窗口查看后台程序 关闭第一个窗口,后台进程没有退出

我要回帖

更多关于 nohup子进程 的文章

 

随机推荐