【シェルスクリプト】対象プロセスが実行中かどうか確認するコマンド

プログラマのメモ帳

この記事では、シェルスクリプト(bashスクリプト)で「対象プロセスが実行中か、存在しているかどうか」を確認するコマンドについて紹介しています。

さっそくですが、今回使用するコマンドは以下の3つです。
1 psコマンド
2 grepコマンド
3 wcコマンド

そしてこのコマンド3つをパイプでつないだコマンドが「対象プロセスが実行中かどうか」を確認する定型的なコマンドになります。

ps aux | grep [対象プロセス名] | grep -v grep | wc -l

サンプルコードを紹介したのち、個別に説明します。
また、今回は対象プロセスとして「10秒スリープするだけ」というsample_sleep.shを用意しました。このプロセスが実行中かどうか確認したいと思います。

#!/bin/bash
echo "sleep 10sec..."
sleep 10s
スポンサーリンク

Sample Code

#!/bin/bash

TIMEOUT=30 # タイムアウトに設定する秒数
count=0
while [ "$count" -lt "$TIMEOUT" ]; do
  ps=`ps aux | grep sample_sleep.sh | grep -v grep | wc -l`
  if [ $ps -eq 0 ]; then # 対象プロセスが存在しない場合
    echo "process none"
    echo "exit 0"
    exit 0
  fi
  sleep 1s
  ((count++))
  echo "process wait ${count}sec"
done

echo "TIMEOUT exit 1"
exit 1

重要な部分はwhile文の下の”ps=ps aux | grep sample_sleep.sh | grep -v grep | wc -lというコマンドです。

それぞれ分解していきます。

ps aux

psコマンドはLinux上で現在動作しているプロセスを表示するコマンドです。このコマンドのオプションに”aux”を指定しています。
オプション a :端末操作のプロセスを表示
オプション u :メモリ使用率、CPUを表示
オプション x :端末操作以外のプロセスを表示

grep sample_sleep.sh

grepコマンドです。psコマンドで表示した一覧から”sample_sleep.sh”を含む行のみを抽出します。

grep -v grep

同じgrepコマンドですが、使用目的が異なります。オプションに”-v”を指定することで”grep”という文字列を含まない行を抽出します。要するに、”sample_sleep.sh”を抽出するために実行した”grep sample_sleep.sh”というコマンド自身も含まれてしまうのを除外します。(これ自身も対象プロセスに含んでしまうとずっと待ち続けてしまいます...)

wc -l

最後にwcコマンドを使って抽出結果の行数を取得します。
オプション -l:改行の数を表示する

この結果が0なら対象プロセスである”sample_sleep.sh”は実行中ではないと確認できます。(コマンド全体をバッククォート「“」で囲んで変数psに格納しています。)

実行例

端末を2つ開いて片方で「sample_sleep.sh」をもう片方で「waitproc.sh」を実行してみます。

こんな感じで対象プロセスが実行中かどうか確認できました。

以上です。
参考になればうれしいです。

コメント

タイトルとURLをコピーしました