Сценарий респауна /etc/inittab при переходе с RHEL/CentOS 5.x на 6.x

У меня есть не разветвляющийся 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".

Но моя проблема в том, что я не могу остановить или перезапустить сценарий (и мне это нужно для ночного cronjob):

# sudo initctl restart pref
initctl: Unknown instance:

# sudo initctl stop pref
initctl: Unknown instance:

Есть идеи, пожалуйста?

(И я не хочу устанавливать какие-либо сторонние программы, такие как daemontools/Tivoli/etc. - потому что я хочу быть моим веб-сервером, чтобы его можно было легко переустанавливать и переносить на другие хостеры).

ОБНОВЛЕНИЕ: вот что я вижу -

# 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:

UPDATE2:

Мой скрипт имеет 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

это все может быть причина, и я могу что-то сделать? (может быть, как-то задержать последующее появление?)

3 ответа

Решение

Что показывает "список initctl"? Вы пробовали 'initctl reload-configuration' после создания задания?

Проблема в том, что после того, как ваш процесс, кажется, завершается сам по себе. У нас нет сообщения журнала для процесса с pid 2083, но я подозреваю, что он неожиданно скончался до того, как вы выпустили следующий 'initctl restart pref' (например, как умерли pids 2128 и 2133). Ключ в том, что initctl restart foo работает ТОЛЬКО, если имя задания foo все еще выполняется. Если он мертв, вам нужно выполнить обычное initctl start foo. Я столкнулся с этим тоже. Я явно вызывал 'initctl stop foo', а затем ожидал, что 'initctl restart foo' будет работать так же, как они это делают со скриптами init. Они не Вы должны использовать 'initctl start foo'.

Загляните на страницу руководства для initctl покажет ответ. Команда initctl понимает только команды запуска, остановки и состояния для управления заданиями. Глагола перезапуска нет.

Ура!

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