Поэтому я использую 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
Upstart уничтожает группу процессов :
Сигнал, указанный в разделе «Сигнал уничтожения», отправляется группе процессов основного процесса. (так, что все процессы, принадлежащие основному процессу заданий, уничтожаются). По умолчанию это сигнал SIGTERM.
Чтобы избежать этого, запустите дочерние процессы в новом сеансе с setsid
, например:
setsid top
пс (ps -eo '%c %a %p %P %r'
) покажет, что процесс имеет уникальный процесс группа и родительский пид 1.
Кажется, вы не понимаете, как работают сценарии.
pre-start script
echo 'Starting myscript Daemon\n'
end script
Этот сценарий запускается до того, как ваши основные сценарии, в случае неудачи, начальная последовательность завершится неудачей. Обычно это используется для некоторых операций ad-hoc, которые позволяют запускать первый скрипт, они не похожи на демоны (постоянно работают в фоновом режиме). Пример:
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
в зависший процесс).
Суть в том, что вы испытываете, совершенно нормально и является желаемым поведением выскочки.