Linux下使命令不受终端断开的影响,保持在后台运行的几种方法及原理

Linux下使命令不受终端断开的影响,保持在后台运行的几种方法及原理,第1张

概述摘自https://www.ibm.com/developerworks/cn/linux/l-cn-nohup/ 记录一下Linux下使命令不受终端断开的影响,保持在后台运行的几个方法及其原理。当用户注销logout或者网络中断时,终端会受到HUP(hangup)信号从而关闭其所有子进程。因为解决方法大体有两种:要么让进程忽略HUP信号,要么让进程运行在新的会话里从而成为不属于此终端下的子进程。 摘自https://www.ibm.com/developerworks/cn/linux/l-cn-nohup/

记录一下linux下使命令不受终端断开的影响,保持在后台运行的几个方法及其原理。当用户注销logout或者网络中断时,终端会受到HUP(hangup)信号从而关闭其所有子进程。因为解决方法大体有两种:要么让进程忽略HUP信号,要么让进程运行在新的会话里从而成为不属于此终端下的子进程。

1(本地单元测试通过)nohup命令可以让要执行的命令忽略HUP信号,再加上&可以保证命令一直在后台运行。

例:nohup commandXXX > test.log 2>&1 &

命令解析:

nohup可以让commandXXX这个命令忽略HUP信号; 第一个>代表将命令的标准输出重定向到指定的地方,这里是test.log 2>&1代表重定向标准错误重定向到标准输出,这里标准输出已经被重定向到test.log,所以标准错误也会输出到test.log。这里引申一下:

linux中标准输入即STDIN , 在/dev/stdin ,一般指键盘输入, shell里代号是0;

linux中标准输出STDOUT, 在/dev/stdout,一般指终端(terminal), 就是显示器, shell里代号是1;

linux中标准错误STDERR,在/dev/stderr也是指终端(terminal),不同的是,错误信息送到这里 shell里代号是2

最后一个&表示让命令在后台运行 关闭终端后可以通过ps -ef|grep commandXXX命令查找到后台进程。 2(本地单元测试通过)setsID命令可以让进行运行在新的会话下,即不属于当前终端的子进程。那么即使当前终端发出了HUP信号,也不会影响该进程。

例:setsID commandXXX

其实通过观察进程中的父进程号(PPID)发现一些端倪,使用setsID后进行的PPID为1(即为init进程ID),并非当前终端的进程ID。

3(本地单元测试通过)将一个或多个命令用()括起来在shell中运行,所提交的作业并不在作业列表中,即无法通过jobs查看到。新提交的进程的PPID为1。

例:(commandXXX)

4(本地单元测试通过)若未加上述任何处理就执行了命令,如何补救才能让其不受HUP信息的影响呢?答案是作业调度。对于某个已执行的命令,经过以下几个步骤可以让其忽略HUP信号: 先使用ctrl+z命令将正在执行的命令变为job作业,;  使用jobs可以查看到具体的作业号(jobID); 再用bg %jobID命令让其在后台运行; 最后使用disown -h jobID 即可使该作业忽略HUP信号 5(未安装此命令,暂未验证)有大量这种需要稳定的在后台运行的命令时,如何避免对每条命令都做上述的重复 *** 作呢?答案是screen。screen提供了ANSI/VT100的终端模拟器,能够在一个真实终端下运行多个全屏的伪终端。screen具有很多参数,功能强大,在此仅简要分析一下为什么使用screen可以避免HUP信号的影响:screen -dnS session new 建立一个处于断开模式下的会话(并指定其会话名); 用screen -List 列出所有会话; 用screen -r session name 重新连接指定会话; 用ctrl -a D暂时断开当前会话;

当我们用-r连接到screen会话时,就进入了一个伪终端,不会再受到HUP信号的影响了。

其他命令: pstree -H pID 查看进程号对应的进程命令的树形结构 fg %jobID 将某个挂起的进程放回前台 bg %jobID 将某个挂起的进程调到后台继续运行,这一点在调试代码时尤其有用,因为将代码编辑器挂起到后台再重新返回时,光标定位仍停留到上次挂起时的位置,避免了重新地凝望的麻烦。 ctrl +c 停止当前命令 jobs -l 列出所有任务的pID,jobs的状态可以是running/stopped/terminated,但若任务终止了(kill),shell会从当前列表中删除任务的进程标识。 总结

以上是内存溢出为你收集整理的Linux下使命令不受终端断开的影响,保持在后台运行的几种方法及原理全部内容,希望文章能够帮你解决Linux下使命令不受终端断开的影响,保持在后台运行的几种方法及原理所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/1022496.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存