回答:
独自のBash関数を作成し、これを次の場所に配置します~/.bashrc
。
check_upstart_service(){
status $1 | grep -q "^$1 start" > /dev/null
return $?
}
出力の解析方法は本当に嫌いですが、別の明白な方法は見当たりません。この場合、Upstartのドキュメントで<service name> start
指定されているように、の出力は非常に信頼できます。
これで、次のように使用できます。
if check_upstart_service ssh; then echo "running"; else echo "stopped"; fi
bashに含まれる文字列に基づく:
job='your_job_name'
job_status=$(status ${job})
if [[ ${job_status} == *running* ]]
then
# do whatever you need
else
# do whatever you need
fi
私の最初の衝動は、提供されたImaginaryRobotsのコードのバリエーションを使用することでした
job='your_job_name'
dbus-send --system --print-reply --dest=com.ubuntu.Upstart \
/com/ubuntu/Upstart/jobs/${job}/_ \
org.freedesktop.DBus.Properties.Get string:'' string:state
これは次のようなものを返します
メソッドreturn sender =:1.0-> dest =:1.94 reply_serial = 2バリアント文字列 "running"
上記のソリューションを使用して、返された文字列に「running」が含まれているかどうかを確認します。ただし、ジョブが実行されていない場合、dbus呼び出しはステータス1で終了し、期待したとおり「待機中」を返します。
status ${job}
そのようなジョブがない場合を除いて、ステータス1で終了することはありません。
DBUSを使用して、その特定のサービスのステータスを照会します。
$ job=myjob
$ dbus-send --system --print-reply --dest=com.ubuntu.Upstart /com/ubuntu/Upstart/jobs/${job}/_ org.freedesktop.DBus.Properties.GetAll string:''
http://upstart.ubuntu.com/cookbook/#get-status-of-job-via-d-bus
独自のupstartジョブを作成する場合は、代わりにupstartイベントまたはパッケージの依存関係を使用する必要があることに注意してください。
upstart statusコマンドはLinux Standard Baseプロジェクトのinitスクリプト仕様に準拠しているようです。つまり、終了コード0はプログラムが実行されていることを示し、終了コード1-3はプログラムが実行されていることを示します。その他の終了コードは、未定義のステータスを意味します。
参照:http : //refspecs.linuxbase.org/LSB_3.0.0/LSB-PDA/LSB-PDA/iniscrptact.html
status $1 2> /dev/null | grep -q "^$1 start" > /dev/null 2> /dev/null
静かにするためにこれを修正したいかもしれません。