/etc/inittab 重生腳本從 RHEL/CentOS 5.x 遷移到 6.x
我在 CentOS 5.7 中有一個非分叉 perl 腳本作為 TCP-sockets 守護程序執行(該腳本是多人遊戲的後端)。它正在由 /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 並在閱讀“man 5 init”後創建了一個新的**/etc/init/pref.conf文件:**
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”執行,並使用“netstat -an”在埠 8080(應該如此)監聽。
但我的問題是我無法停止或重新啟動腳本(我需要它用於每晚的 cronjob):
# sudo initctl restart pref initctl: Unknown instance: # sudo initctl stop pref initctl: Unknown instance:
請問有什麼想法嗎?
(而且我不想安裝任何第 3 方軟體,例如 daemontools/Tivoli/等。因為我想成為我的 Web 伺服器,以便輕鬆地重新安裝和移動到其他主機)。
**更新:**這是我看到的 -
# 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:
我的劇本有兩個特點:
1)當它得到 SIGTERM 或 SIGINT 時,它將一些數據寫入 PostgreSQL,這需要 10-15 秒
- 多次啟動後,後續執行會立即失敗,因為只有第一個實例能夠監聽 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
這可能是原因嗎?有什麼我可以做的嗎?(也許會以某種方式延遲隨後的產卵?)
‘initctl list’ 顯示什麼?創建作業後您是否嘗試過“initctl reload-configuration”?
問題是,在您的程序似乎自行終止之後。我們沒有 pid 2083 程序的日誌消息,但我懷疑它在您發出下一個“initctl restart pref”之前意外死亡(例如 pids 2128 和 2133 如何死亡)。關鍵是 ‘initctl restart foo’只有在foo作業名稱仍在執行時才有效。如果它死了,你需要做一個正常的’initctl start foo’。我也遇到了這個。我明確地呼叫了“initctl stop foo”,然後期望“initctl restart foo”像他們使用初始化腳本一樣工作。他們沒有。你必須使用’initctl start foo’。