CentOS 5.7でTCPソケットデーモンとして実行されている非フォークPerlスクリプト(このスクリプトはマルチプレイヤーゲームのバックエンドです)があります。/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
また、「ps uawx」を使用してユーザーafarberで実行され、「netstat-an」を使用してポート8080でリッスンしているスクリプトを確認してください。
しかし、私の問題は、スクリプトを停止または再開できないことです(そして、毎晩のcronジョブにそれが必要です)。
# Sudo initctl restart pref
initctl: Unknown instance:
# Sudo initctl stop pref
initctl: Unknown instance:
何かアイデアはありますか?
(そして、daemontools/Tivoli/etcのようなサードパーティのソフトウェアをインストールしたくありません。私は自分のWebサーバーになり、他のホスティング業者に簡単に再インストールして移動できるようにしたいからです)。
PDATE:これが私が見るものです-
# 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:
PDATE2:
私のスクリプトには2つの特徴があります。
1)SIGTERMまたはSIGINTを取得すると、PostgreSQLにデータが書き込まれます。これには10〜15秒かかります。
2)何度も開始されると、最初のインスタンスのみが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'は何を示していますか?ジョブの作成後に「initctlreload-configuration」を試しましたか?
問題は、プロセスがそれ自体で終了しているように見えることです。 pid 2083のプロセスのログメッセージはありませんが、次の「initctl restart pref」を発行する前に、予期せずに停止したと思われます(たとえば、pid 2128および2133がどのように停止したかなど)。重要なのは、 'initctl restart foo' ONLY WORKSfooジョブ名がまだ実行されている場合です。死んでいる場合は、通常の「initctlstartfoo」を実行する必要があります。私もこれに出くわしました。私は明示的に「initctlstopfoo」を呼び出し、「initctlrestartfoo」がinitスクリプトの場合と同じように機能することを期待していました。彼らはしません。 'initctl startfoo'を使用する必要があります。