こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

シェルの変数の動作についての質問

solaris8上で、シェルから別のシェルを子プロセスを動作させて
その子プロセスが終了したかを判定するシェルを作成しました。
そのシェルの抜粋は下記のようになっています。
----------------------------------------------------
"コマンド実行" &
PID=$!
i=0
ERR_FLG=1
echo " PID="$PID >> tmp.txt   ・・・・(1)
while [ 1 ]
do
  if [ `ps -ef | grep $PID | grep -v grep | wc | awk '{print $1}'` -eq 0 ]; then
    ERR_FLG=0
    break
  fi
  "終了条件を満たしたかを確認するサブルーチン"
  if [ $? -eq 1 ]; then
    echo "Time out" >> tmp.txt
    break
  fi
  i=`expr $i + 1 `
  sleep 10
done
echo `ps -ef | grep $PID | grep -v grep` >> tmp.txt ・・・・(2)
----------------------------------------------------
殆どの場合問題なく動作しているのですが、
ごく稀に、(1)と(2)で取得した$PIDの値が異なるという現象が起きます。
当然サブルーチン上で、PIDを書換する処理もありません。
どのような状況の時に、現象が起きるかもはっきりしていません。
この現象の回避方法が判る方がおられましたら御教示の程、
宜しくお願いします。

投稿日時 - 2009-04-21 16:32:11

QNo.4897712

困ってます

このQ&Aは役に立ちましたか?

4人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

 このようなケースでは、下記のようにシェル変数で保存で保存するのではなく、ファイルに書き出しファイルで保存して対応して回避したことあります。 ApacheなどでもプロセスIDをファイルに書き出しているので、ファイルに書き出すのが確実な方法ではと思います。
(1)を下記のように修正
echo " PID="$PID >> /tmp/PID_(シェル固有の識別コード)

> (1)の出力結果がPID=766
> (2)の出力結果がps -ef | grep 2766 | grep -v grep
PID=766が正しいPIDであれば上記の方法で回避できます。

あと・・・「2766」って「2」「766」ということでないですよね?
「2」「766」なら、psのタイミングによっては普段は表示されないプロセスが表示されることがあるので・・・それが原因になるかもしれません。

投稿日時 - 2009-04-24 03:46:29

補足

やはり、ファイル出力した方がいいのでしょうか?
10秒周期でループしているので、その度ファイルを読むことになるので、できれば避けたかったのですが・・

それと、個人的にはファイル化することで、避けられると思いますがシェル変数だと上手く行かないのに、ファイル読込だと大丈夫だと
他人に説明がうまく出来ないのがネックになります。

発生する頻度が非常に低い(30回に1回あるかどうか)ので、はっきりしたことは判らないのですが、
2766は今回のシェル及びシェルで終了させるプロセスとは、全く別のプロセスでした。
但し、偶然「2766」になったのか「766」に「2」が追加されたのかは
現段階では判りません。
※一応、ループ内でも$PIDの値に変化がないか、ログに出力するように変更しましたが、
 現象が起こるのがいつになることやら・・

投稿日時 - 2009-04-24 15:11:33

ANo.2

ふと思ったのだが, なぜ
ps -ef
してるんだろう. 「指定したプロセスID を持つプロセスの情報」が欲しいだけなら, もっと適切にオプションを指定すればいいのに.

投稿日時 - 2009-04-23 11:35:36

ANo.1

> PID=$!
> i=0
> ERR_FLG=1
> echo " PID="$PID >> tmp.txt   ・・・・(1)
-------------
> echo `ps -ef | grep $PID | grep -v grep` >> tmp.txt ・・・・(2)
-------------
> ごく稀に、(1)と(2)で取得した$PIDの値が異なるという現象

(1)で取得したPIDを psでgrep した時に「$PIDの値が異なる」??? 何か変です!!
「grep -v grep」で自分自身を除外しているので「(1)と(2)で取得した$PIDの値が異なる」という現象が、どのような結果なのかを明示してもらわないと何ともアドバイスしようがないです。

更に、何故 (1)と(2)でPIDを取得しているのでしょうか?
自分自身のPIDを知るだけなら(1)で十分で「(2)でPIDを取得し、比較することの意味が不明です」

投稿日時 - 2009-04-23 09:34:35

補足

"コマンド実行" の部分であるプロセスを終了させる為のシェル(以降終了シェル)を起動しています。
その終了シェルが終了したら、ループを抜けるようになっていますが
永遠に待ち続けることができないので
"終了条件を満たしたかを確認するサブルーチン"にて、
一定の時間になったら"Time out"になるようにしています。

本来で、有れば(1),(2)とも不要なログなのですが、
想定内で終了しないことがあったので、
・終了シェルのプロセスIDが正常に取れているか?
(実際は、whileの前に終了シェル名でgrepした結果をtmp.txtへ出力し同一IDになっていることを確認しています)
・本当に終了シェルが終了してないのか
を確認するためにログを入れています。

今回の結果ですと、
(1)の出力結果がPID=766
(2)の出力結果がps -ef | grep 2766 | grep -v grep
となっていたので
ループ内の何処かで$PIDが書き換わったはずなのですが
原因が判らない状態です。

投稿日時 - 2009-04-23 16:39:34

あなたにオススメの質問