web-dev-qa-db-ja.com

RHEL / CentOS5.xから6.xに移行する/ etc / inittabリスポーンスクリプト

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

それが理由かもしれませんが、私にできることはありますか? (多分、その後のスポーンをどういうわけか遅らせますか?)

2

'initctl list'は何を示していますか?ジョブの作成後に「initctlreload-configuration」を試しましたか?

2
sinping

問題は、プロセスがそれ自体で終了しているように見えることです。 pid 2083のプロセスのログメッセージはありませんが、次の「initctl restart pref」を発行する前に、予期せずに停止したと思われます(たとえば、pid 2128および2133がどのように停止したかなど)。重要なのは、 'initctl restart foo' ONLY WORKSfooジョブ名がまだ実行されている場合です。死んでいる場合は、通常の「initctlstartfoo」を実行する必要があります。私もこれに出くわしました。私は明示的に「initctlstopfoo」を呼び出し、「initctlrestartfoo」がinitスクリプトの場合と同じように機能することを期待していました。彼らはしません。 'initctl startfoo'を使用する必要があります。

3
beantownguy80