• Bash,后台与nohup


    老式的Bourne shell在退出以后,其中运行的子进程也就退出了。这是因为,在shell中运行的程序都是shell的子进程,和shell处在同一个进程组,当 shell退出时,子进程也同时接收到SIGHUP信号,从而退出。所以,通常使用nohup来运行需要shell退出后继续执行的程序。nohup会将 进程交给1号进程init收养,和shell进程脱离关系,即使shell退出程序仍然可以继续运行。

    然而最近蒙人提点,发现,在bash中及时不使用nohup,只将程序放在后台运行,在bash退出后程序仍然在继续执行,其父进程变成了init。

    原来,较新的如bash,tch之类的shell,后台进程是放在单独的进程组里,和shell不在同一个进程组中,这样shell退出时就不会直 接接收到操作系统发送的SIGHUP信号,从而后台的子进程在shell退出以后存活下来。而Unix/Linux系统中,所有的进程都必须有自己的父进 程,当操作系统发现这个进程没有父进程后,就会被被init收养。

    然而,如果bash直接收到了SIGHUP信号,而不是用exit正常退出(例如远程ssh时断线),它仍然会将SIGHUP信号发送给子进程,使 运行在本shell中的所有程序终止。这种情况下,可以使用bash内置的disown命令,使bash不向子进程转发SIGHUP信号,或者将程序放在 一个子shell中运行(用括号括起命令)来解决这个问题。

    另一个问题是,bash不会重定向进程的输入输出,所以当程序有向tty的输出时,会由于找不到设备而出错。这种情况就只能使用nohup了。

  • 相关阅读:
    mov与lea
    Android APP启动流程
    Android JAVA转Kotlin速成
    算法学习
    平衡树板子
    舞蹈链板子
    肖sir__会计分录
    多测师肖sir___项目讲解(保险、信贷系统)
    肖sir_医疗系统
    肖sir__性能测试或者压力测试你是怎么做的?
  • 原文地址:https://www.cnblogs.com/ShaneZhang/p/2845502.html
Copyright © 2020-2023  润新知