暴发户杀死所有由脚本启动的进程

Mir*_*ate 6 upstart process

所以我使用 Upstart[myscript]来启动一个脚本[A],它会启动另一个脚本[B],而后者又会启动其他一些脚本[GROUP C]

当我运行时stop [myscript],我遇到了[GROUP C]也停止的异常行为。中的每个脚本[GROUP C]都以 开头&,并在后台运行。我很惊讶他们也被stop [myscript]命令杀死了。为什么会这样,以及如何防止它发生?

编辑:基本上[myscript]如下:

pre-start script
          echo 'Starting myscript Daemon\n'
end script

script
        exec /foo/bar/myscript-start.sh
end script

post-stop script
        echo 'and apparently we are done....'
end script
Run Code Online (Sandbox Code Playgroud)

bai*_*ain 2

Upstart杀死进程组

Kill 信号节指定的信号被发送到主进程的进程组。(这样属于作业主进程的所有进程都被杀死)。默认情况下,该信号为 SIGTERM。

为了避免这种情况,请使用 启动新会话中的子进程setsid,例如:

setsid top
Run Code Online (Sandbox Code Playgroud)

ps ( ps -eo '%c %a %p %P %r') 将显示该进程有一个唯一的进程组,并且父进程 pid 为 1。


Bra*_*iam 1

看来您不明白脚本节是如何工作的。

开始前节

pre-start script
          echo 'Starting myscript Daemon\n'
end script
Run Code Online (Sandbox Code Playgroud)

该脚本在主脚本之前启动,如果失败,启动序列将失败。这通常用于一些允许第一个脚本启动的临时操作,这些操作不是类似守护进程的(在后台持续运行)。例子:

pre-start script
    /lib/init/apparmor-profile-load usr.sbin.avahi-daemon
end script

script
    opts="-D"
    [ -e "/etc/eucalyptus/avahi-daemon.conf" ] && opts="${opts} -f /etc/eucalyptus/avahi-daemon.conf"
    exec avahi-daemon ${opts}
end script
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,apparmor 配置文件首先从 DBus 加载(是的,如果您不了解 Ubuntu 的后端,那就有点尴尬),然后按预期启动服务。此操作是为一旦执行就终止的进程而设计的。

脚本节

script
        exec /foo/bar/myscript-start.sh
end script
Run Code Online (Sandbox Code Playgroud)

这是程序中唯一需要连续运行的部分,并且 upstart 必须跟踪它的 PID。当您停止脚本时,该进程就会终止。

停止后节

post-stop script
        echo 'and apparently we are done....'
end script
Run Code Online (Sandbox Code Playgroud)

这节被设计为一种清理过程。一旦主脚本正常结束,它将被执行。例如,批准:

post-stop script
    # Check for a hung resume.  If we find one try and grab everything
    # we can to aid in its discovery
    if [ -e /var/lib/pm-utils/status ]
    then
        ps -wwef > /var/lib/pm-utils/resume-hang.log
    fi

    if [ "`dd if=/proc/sys/kernel/core_pattern count=1 bs=1 2>/dev/null`" != "|" ]
    then
        exit 1
    else
        echo 0 > /proc/sys/fs/suid_dumpable
        echo "core" > /proc/sys/kernel/core_pattern
    fi
end script
Run Code Online (Sandbox Code Playgroud)

它尝试检测不成功的睡眠恢复,并开始准备检测下一次挂起,以便它可以生成有用的报告(是的,又复杂了,但这是我发现的最简单的脚本,过于简单化ufw)。正如您所看到的,每个进程都会自行终止,因为它可能会阻止系统关闭(在这种情况下,还有一个脚本会向挂起的进程发送TERM信号KILL)。

最重要的是,您所经历的一切是完全正常的,并且是暴发户所期望的行为。

  • 这是有价值的信息,如果您将其包含在答案中,我将非常感激,但我的实际问题仍然是一样的:“为什么会这样,以及如何防止它发生?” 我认为暴发户正在杀死儿童群体,我只是不知道原因或如何阻止它发生。 (2认同)