因此我使用 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
答案1
暴发户终止进程组:
由 kill 信号节指定的信号将发送到主进程的进程组。(这样,属于作业主进程的所有进程都会被杀死)。默认情况下,此信号为 SIGTERM。
为了避免这种情况,请使用 在新会话中启动子进程setsid
,例如:
setsid top
ps ( ps -eo '%c %a %p %P %r'
) 将显示该进程具有唯一的进程组,并且父 pid 为 1。
答案2
看来您不明白脚本节是如何工作的。
开始前的段落
pre-start script
echo 'Starting myscript Daemon\n'
end script
此脚本在主脚本之前启动,如果失败,启动顺序将失败。这通常用于允许第一个脚本启动的一些临时操作,这些操作不是守护进程(在后台持续运行)。示例:
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
如您所见,apparmor 配置文件首先从 DBus 加载(是的,如果您不了解 Ubuntu 的后端,这有点尴尬),然后按预期启动服务。此操作是为执行后会终止的进程设计的。
脚本节
script
exec /foo/bar/myscript-start.sh
end script
这是程序中唯一需要持续运行的部分,upstart 必须跟踪其 PID。当您停止脚本时,此进程将终止。
停顿后节
post-stop script
echo 'and apparently we are done....'
end script
这些节被设计为一种清理过程。它将在主脚本正常终止后执行。例如,apport:
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
它尝试检测未成功的从睡眠中恢复,并开始准备检测下一次挂起,以便生成有用的报告(是的,又很复杂,但这是我发现的最简单的脚本,除了ufw
过于简单之外)。正如您所看到的,每个进程都会自行死亡,因为它可能会阻止系统关闭(在这种情况下,还有一个脚本可以发送TERM
信号KILL
给挂起的进程)。
底线是,您所经历的事情完全正常,并且是新贵所期望的行为。