擬似コードで私は次のようなことをしようとしています
if myService is running
restart myService
else
start myService
上記をbashスクリプトなどに変換するにはどうすればよいですか?
標準的な方法は、サービスのPIDを格納するためにPIDファイルを使用することです。次に、PIDファイルに保存されているPIDを使用して、サービスがすでに実行されているかどうかを確認できます。
ディレクトリの下にあるさまざまなスクリプトを/etc/init.d
見て、それらがPIDファイルをどのように使用しているかを確認してください。また/var/run
、ほとんどのLinuxシステムで、PIDファイルが保存されている場所を確認してください。
このようなことを行うことができます。これは、すべてのBourneシェルタイプのシェルに対してこれを処理する一般的な方法です。
# Does the PID file exist?
if [ -f "$PID_FILE" ]
then
# PID File does exist. Is that process still running?
if ps -p `cat $PID_FILE` > /dev/null 2&1
then
# Process is running. Do a restart
/etc/init.d/myService restart
cat $! > $PID_FILE
else
# Process isn't' running. Do a start
/etc/init.d/myService start
cat $! > $PID_FILE
else
# No PID file to begin with, do a restart
/etc/init.d/myService restart
cat $! > $PID_FILE
fi
ただし、Linuxでは、 pgrepを利用できます。
if pgrep myService > /dev/null 2>&1
then
restart service
else
start service
fi
中括弧を使用しないことに注意してください。if
ステートメントは、コマンドの終了ステータスに基づいて動作しますpgrep
。STDOUTとSTDERRの両方を/dev/ nullに出力しているのは、それらを印刷したくないからです。pgrep
コマンド自体の終了ステータスが必要です。
PGREPのマンページを読む
かなりの数のオプションがあります。たとえば、-x
意図しない一致を防ぐためにを使用したい場合や-f
、サービスの開始に使用される完全なコマンドラインでの一致を使用する必要がある場合があります。
ps auxを実行したときにmyServiceが表示された場合は、bashでこれを実行できます(jordanmが提案したようにpgrepを使用するように編集されています)。
if [ $(pgrep myService) ]; then
restart myService;
else
start myService;
fi