0

Python プログラムが実行されているかどうかを確認するための短い bash スクリプトがあります。プログラムは実行時に PID ファイルを書き出すので、これを実行中のプロセスの現在のリストと比較すると、必要なものがわかります。しかし、変数が変更されてから明らかに元に戻るという問題があります。スクリプトは次のとおりです。

#!/bin/bash
# Test whether Home Server is currently running
PIDFILE=/tmp/montSvr.pid
isRunning=0
# does a pid file exist?
if [ -f "$PIDFILE" ]; then
  # pid file exists
  # now get contents of pid file
  cat $PIDFILE | while read PID; do
    if [ $PID != "" ]; then
      PSGREP=$(ps -A | grep $PID | awk '{print $1}')
      if [ -n "$PSGREP" ]; then
        isRunning=1
        echo "RUNNING: $isRunning"
      fi
    fi
  done
fi
echo "Running: $isRunning"
exit $isRunning

Python スクリプトの実行時に得られる出力次のとおりです。

RUNNING: 1
Running: 0

また、bash スクリプトの終了値は 0 です。したがって、これらすべての if ステートメント内で isRunning が変更されます (つまり、コードは期待どおりに実行されます) が、どういうわけか isRunning は再び 0 に戻ります。混乱している...

4

2 に答える 2

6

パイプの後のコマンド|はサブシェルで実行されます。サブシェルで変数値を変更しても、親シェルには反映されません。

解決策:ループを次のように変更します

while read PID; do
    # ...
done < $PIDFILE
于 2012-11-05T13:53:57.017 に答える
0

問題のパイプです。このようにパイプを使用することは、ループが独自の環境を持つサブシェルで実行されることを意味します。を強制終了しcat、代わりに次の構文を使用します。

while read PID; do
    if [ $PID != "" ]; then
      PSGREP=$(ps -A | grep $PID | awk '{print $1}')
      if [ -n "$PSGREP" ]; then
        isRunning=1
        echo "RUNNING: $isRunning"
      fi
    fi
  done < "$PIDFILE"
于 2012-11-05T13:55:23.560 に答える