私はUbuntu 12.04のUpstart 1.5を使用して、一部のユーザーが作成したプロセスを管理していますが、起動時にシステムジョブとして管理する必要があります。/etc/initに.confファイルを作成します。次のとおりです。
description "Start face services recognition and monitors it"
version "1.0"
start on runlevel[5]
stop on runlevel[06]
respawn
expect fork
normal exit 0 TERM STOP
script
exec sh -c /home/verstand/facefeatures
end script
post-stop script
if [ ! $EXIT_STATUS && ! $EXIT_SIGNAL ]
then
exec Sudo -u $USER "/sbin/shutdown -r now"
fi
end script
ここでの信号は、Upstartがプロセスの再生成に失敗した緊急の場合にシステムを再起動することを目的としています。
現在、問題はプロセスを開始するときにSudo initctl start facefeatures
で正常に実行されますが、停止しようとするとハングし、Ctl + Cを使用してttyコントロールを返す必要があります。さらに、再起動または再起動しようとすると、Upstartは既に実行されていることを報告します:start/running facefeatures
が、initctl list
を使用すると、Upstartはプロセスが強制終了されたかのように報告します:stop/killed facefeatures
また、最初に再起動するとプロセスが正常に実行されますが、2回目に再起動するとそれ以上は実行されません...
Confファイルの問題は何ですか?これを行う正しい方法は何ですか?
facefeaturesがスクリプトではない場合、どのプロセスを監視するかわからないという問題が発生すると考えています。 scriptスタンザではなくexecで開始してください:
description "Start face services recognition and monitors it"
version "1.0"
start on runlevel[5]
stop on runlevel[06]
normal exit 0 TERM STOP
expect fork
respawn
exec /home/verstand/facefeatures
post-stop script
if [ ! $EXIT_STATUS && ! $EXIT_SIGNAL ]
then
exec Sudo -u $USER "/sbin/shutdown -r now"
fi
end script
サービスを停止すると、プログラムはTERMを受け取ります。そのシグナルに反応しない場合、5秒後に殺されます。