У меня есть скрипт Perl без разветвления, работающий как демон TCP-сокетов (этот скрипт является бэкэндом для многопользовательской игры) в CentOS 5.7. Он запускается и возрождается / etc / inittab:
pref:3:respawn:/bin/su -c '/usr/local/pref/pref.pl >/tmp/pref-`date +%a`.txt 2>&1' afarber
Каждую ночь он перезапускается cronjob:
33 1 * * * kill `cat /tmp/pref.pid`
(где файл /tmp/pref.pid создается самим скриптом).
Эта установка хорошо работала для меня с многих лун. Теперь я пытаюсь перейти на CentOS 6.x и создал новый /etc/init/pref.conf после прочтения "man 5 init":
start on stopped rc RUNLEVEL=3
stop on starting rc RUNLEVEL=[!3]
console output
respawn
chdir /tmp
exec /bin/su -c '/usr/local/pref/pref.pl >/tmp/pref-`date +%a`.txt 2>&1' afarber
И можно начать с
# sudo initctl start pref
pref start/running, process 2590
а также посмотрите, как скрипт работает под пользователем afarber с "ps uawx" и прослушивает порт 8080 (как и должно) с "netstat -an".
Но моя проблема в том, что я не могу остановить или перезапустить скрипт (а это мне нужно для ночного задания cron):
# sudo initctl restart pref
initctl: Unknown instance:
# sudo initctl stop pref
initctl: Unknown instance:
Есть идеи, пожалуйста?
(И я не хочу устанавливать какое-либо стороннее программное обеспечение, такое как daemontools / Tivoli / и т. Д. - потому что я хочу, чтобы мой веб-сервер был легко переустановлен и перемещен на другие хостеры).
ОБНОВИТЬ: вот что я вижу -
# initctl reload-configuration
# initctl list
rc stop/waiting
tty (/dev/tty3) start/running, process 1515
tty (/dev/tty2) start/running, process 1513
tty (/dev/tty1) start/running, process 1511
tty (/dev/tty6) start/running, process 1521
tty (/dev/tty5) start/running, process 1519
tty (/dev/tty4) start/running, process 1517
plymouth-shutdown stop/waiting
control-alt-delete stop/waiting
kexec-disable stop/waiting
quit-plymouth stop/waiting
rcS stop/waiting
prefdm stop/waiting
pref start/running, process 1507
init-system-dbus stop/waiting
splash-manager stop/waiting
start-ttys stop/waiting
rcS-sulogin stop/waiting
serial stop/waiting
# initctl status pref
pref start/running, process 1507
# initctl restart pref
pref start/running, process 2083
# initctl restart pref
initctl: Unknown instance:
# initctl restart pref
initctl: Unknown instance:
ОБНОВЛЕНИЕ2:
У моего сценария есть 2 особенности:
1) Когда он получает SIGTERM или SIGINT, он записывает некоторые данные в PostgreSQL, и это занимает 10-15 секунд
2) Когда он запускается несколько раз, последующие запуски немедленно завершатся ошибкой, потому что только 1-й экземпляр сможет прослушивать TCP-порт 8080
И в / var / log / messages вижу:
...
17:44:25 static init: pref main process ended, respawning
17:44:26 static init: pref main process (2128) terminated with status 98
17:44:26 static init: pref main process ended, respawning
17:44:26 static init: pref main process (2133) terminated with status 98
17:44:26 static init: pref respawning too fast, stopped
Возможно, это все причина и что я могу сделать? (может как-нибудь отложить последующие спауны?)
Проблема в том, что после того, как ваш процесс, кажется, завершается сам по себе. У нас нет сообщения журнала для процесса с pid 2083, но я подозреваю, что он неожиданно умер до того, как вы выполнили следующий «initctl restart pref» (например, как умерли pid 2128 и 2133). Ключ в том, что initctl restart foo ТОЛЬКО РАБОТАЕТ если фу имя задания все еще выполняется. Если он мертв, вам нужно выполнить обычную команду initctl start foo. Я тоже столкнулся с этим. Я явно называл «initctl stop foo», а затем ожидал, что «initctl restart foo» будет работать так же, как и со сценариями инициализации. Они этого не делают. Вы должны использовать initctl start foo.
Что показывает 'initctl list'? Вы пробовали «initctl reload-configuration» после создания задания?
Заглянув на страницу руководства по initctl, вы получите ответ. Команда initctl понимает только команды start, stop и status для управления заданиями. Нет доступной команды перезапуска.
Ура!