【问题标题】:does bash -c work like nohup?bash -c 像 nohup 一样工作吗?
【发布时间】:2012-07-12 01:14:46
【问题描述】:

在 redhat 中使用旧的 initscript 时,我遇到了这样的问题

daemon --user $USER --pidfile $PIDFILE "cmd >>/var/log/cmd.log 2>&1 &"

它似乎很可疑,因为它不使用 nohup。但是程序可以正常工作,即使退出控制终端也能保持运行。进一步调查我发现一个命令,例如bash -c 'sleep 1000&',即使退出了调用它的终端(如果没有nohup,这应该是不可能的)。我用最新的 ubuntu 验证了这种行为。

所以我的问题是,这种行为众所周知吗?也就是说,我可以在我的初始化脚本中使用它而不是使用 nohup 吗?还是 bash 中的错误?

【问题讨论】:

  • Bash 仅在交互式会话中进行作业控制(包括发送作业 SIGHUP)。
  • @jordanm 这是一个答案;为什么不做一个?
  • 我也想。对于 bash,这似乎并非普遍适用。

标签: bash daemon nohup


【解决方案1】:

这激起了我的好奇心:SIGHUP 的行为是否像以前那样?第一条线索来自 shopt 上的 bash 手册页:

huponexit 如果设置,bash 将在交互式登录 shell 退出时向所有作业发送 SIGHUP。

在原版 Ubuntu 12.04 安装中,即使是交互式会话,huponexit 也默认为“关闭”。作为一名经验主义者,我希望看到它的实际应用:

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>

void
hupped(int i)
{
    fprintf(stderr, "received SIGHUP 0x%x\n", i);
    exit(1);
}

int main(int argc,char * argv[])
{
    fprintf(stderr, "registering SIGHUP handler for PID %d\n", getpid());
    signal(SIGHUP, hupped);
    sleep(3600*5);
    return 0;
}

即使 stdin 和 stdout 绑定到 tty,它也不会在 shell 退出时收到信号,这与文档一致。正如预期的那样,该进程成为 init 的子进程,并且与 pty 的连接被关闭。

从它的默认值来看,SIGHUP 对 bash 交互式会话并不“有趣”。但是,只要您依赖于此,您就会找到一个反例,很可能是在最糟糕的时候。

【讨论】:

    猜你喜欢
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多