所以我使用 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)
Upstart杀死进程组:
Kill 信号节指定的信号被发送到主进程的进程组。(这样属于作业主进程的所有进程都被杀死)。默认情况下,该信号为 SIGTERM。
为了避免这种情况,请使用 启动新会话中的子进程setsid,例如:
setsid top
Run Code Online (Sandbox Code Playgroud)
ps ( ps -eo '%c %a %p %P %r') 将显示该进程有一个唯一的进程组,并且父进程 pid 为 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)。
最重要的是,您所经历的一切是完全正常的,并且是暴发户所期望的行为。