Назад | Перейти на главную страницу

/ 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".

Но моя проблема в том, что я не могу остановить или перезапустить скрипт (а это мне нужно для ночного задания 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 для управления заданиями. Нет доступной команды перезапуска.

Ура!