Upstart убивает весь процесс, запущенный скриптом

Поэтому я использую 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
6
задан 7 November 2013 в 03:52

2 ответа

Upstart уничтожает группу процессов :

Сигнал, указанный в разделе «Сигнал уничтожения», отправляется группе процессов основного процесса. (так, что все процессы, принадлежащие основному процессу заданий, уничтожаются). По умолчанию это сигнал SIGTERM.

Чтобы избежать этого, запустите дочерние процессы в новом сеансе с setsid, например:

setsid top

пс (ps -eo '%c %a %p %P %r') покажет, что процесс имеет уникальный процесс группа и родительский пид 1.

0
ответ дан 7 November 2013 в 03:52

Кажется, вы не понимаете, как работают сценарии.

pre-start stanza

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 stanza

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 в зависший процесс).

Суть в том, что вы испытываете, совершенно нормально и является желаемым поведением выскочки.

0
ответ дан 7 November 2013 в 03:52

Другие вопросы по тегам:

Похожие вопросы: