bashスクリプトでupstartジョブのステータスを確認するにはどうすればよいですか?


10

アップスタートジョブがBashスクリプト内で実行されているかどうかをどのように判断しますか?つまり、次のようなことを行うには「ブール」値が必要です。

#!/bin/bash
if [ determine_if_job_x_is_running ]; then
  echo "I see upstart job X is running, please stop it before ..."
fi

回答:


9

独自の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

2
status $1 2> /dev/null | grep -q "^$1 start" > /dev/null 2> /dev/null静かにするためにこれを修正したいかもしれません。
デビッドG

1

通常はPIDファイルを使用しますが、pgrepを使用してプロセスを確認することもできます。あなたのサービスが呼び出されてjobXいると仮定しますこれは動作します:

if [ $(pgrep jobX) ]; then

またはさらに良い

if pgrep jobX > /dev/null 2>&1

1

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で終了することはありません。


1
バリエーション... isRunning = $(status $ {job} | grep running | wc -l)は、実行されている場合は1を返し、実行されていない場合は0を返します。
奈良園

0

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イベントまたはパッケージの依存関係を使用する必要があることに注意してください。


これは、ブール値を取得するために解析する必要があるある種のテキストステータスを出力するだけのようです。
laslowh 2013

0

upstart statusコマンドはLinux Standard Baseプロジェクトのinitスクリプト仕様に準拠しているようです。つまり、終了コード0はプログラムが実行されていることを示し、終了コード1-3はプログラムが実行されていることを示します。その他の終了コードは、未定義のステータスを意味します。

参照:http : //refspecs.linuxbase.org/LSB_3.0.0/LSB-PDA/LSB-PDA/iniscrptact.html

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.