zoukankan      html  css  js  c++  java
  • Linux下使命令不受终端断开的影响,保持在后台运行的几种方法及原理

    摘自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会从当前列表中删除任务的进程标识。
  • 相关阅读:
    如何使用SAP Intelligent Robotic Process Automation自动操作Excel
    OpenSAML 使用引导 IV: 安全特性
    Spring Cloud Zuul 网关使用与 OAuth2.0 认证授权服务
    微服务架构集大成者—Spring Cloud (转载)
    Spring Cloud Eureka 服务注册列表显示 IP 配置问题
    使用 Notification API 开启浏览器桌面提醒
    SignalR 中使用 MessagePack 序列化提高 WebSocket 通信性能
    配置 Nginx 的目录浏览功能
    关于 Nginx 配置 WebSocket 400 问题
    Migrate from ASP.NET Core 2.0 to 2.1
  • 原文地址:https://www.cnblogs.com/feiquan/p/11379291.html
Copyright © 2011-2022 走看看