ksh スクリプトの小技集


004. プロセスの停止

    プロセスを停止する処理を書く時、ps と grep と kill を使いますよね?

    例1)悪い例

       #!/usr/bin/ksh
       PID=$(ps -ef | grep プロセス名 | awk '{ print $1 }')
       kill ${PID}

       これは何がいけないでしょう?

       まず、プロセスが存在しない時、変数 PID が空文字列となってしまい、3行目でエラーになってしまいます。

       そこで、エラー処理を追加してみます。

    例2)まだ悪い例

       #!/usr/bin/ksh
       PID=$(ps -ef | grep プロセス名 | awk '{ print $1 }')
       if [[ ! "${PID}" = "" ]]
       then
         kill ${PID}
       fi

       とりあえず、文法エラーは出なくなりましたが、まだ問題があります。

       それは、2行目を実行している時に、grep のプロセスが ps の結果にはいってきてしまうことがあるからです。
       すると、grep の結果が正しく終了する前に強制終了されてしまい、PID に正しい結果が入りません。

       そこで、

    例3)とりあえずの正解?

       #!/usr/bin/ksh
       PID=$(ps -ef | grep プロセス名 | grep -v grep | awk '{ print $1 }')
       if [[ ! "${PID}" = "" ]]
       then
         kill ${PID}
       fi

       こうすることで、grep のプロセスが PID に入ってくることを回避できます。


    でも、まだまだ問題が隠れています。

    例えば、
        1. 複数のプロセスに対応していない。
        2. kill では正常終了しない。
	3. そもそも kill して良いの?
	4. その他にもこんなことが...


    ...この辺は次回。
  

2005/05/23 ごめんなさい。| awk '{ print $1 }' を書き忘れてました。 m(_ _)m
戻る
ちほ Last Updated: 2/9/2006
WebMaster: Satoshi Yamashina chihioizu@gmail.com