Upstart

/etc/inittab 重生腳本從 RHEL/CentOS 5.x 遷移到 6.x

  • June 19, 2014

我在 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 秒

  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

這可能是原因嗎?有什麼我可以做的嗎?(也許會以某種方式延遲隨後的產卵?)

‘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’。

引用自:https://serverfault.com/questions/318742