zoukankan      html  css  js  c++  java
  • 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了。

  • 相关阅读:
    【2018 “百度之星”程序设计大赛
    分班级(经典二分)
    【2018 “百度之星”程序设计大赛
    【zznu-夏季队内积分赛3-J】追忆
    常见网络名词解释
    【zznu-夏季队内积分赛3-G】2333
    【zznu-夏季队内积分赛3-F】学无止境
    【zznu-夏季队内积分赛3-I】逛超市
    html/css/javascript练习代码
    花生壳免费域名80端口无法访问问题处理
  • 原文地址:https://www.cnblogs.com/ShaneZhang/p/2845502.html
Copyright © 2011-2022 走看看