2012-11-05 71 views
0

我有一個簡短的bash腳本來檢查是否正在運行Python程序。該程序在運行時寫出一個PID文件,因此將它與當前正在運行的進程列表進行比較,可以提供我所需的內容。但是我遇到了一個變化的問題,然後顯然改變了!這裏的腳本:Bash變量不會持續變化

#!/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,所以isRunning是得到改變在所有這些if語句中(即代碼按照預期執行),但是然後以某種方式正在運行再次返回到0。困惑...

回答

6

管道後的命令|在子外殼中運行。子shell中變量值的更改不會傳播到父shell。

解決方案:你的循環改變

while read PID; do 
    # ... 
done < $PIDFILE 
+0

謝謝choroba - 工作。 –

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" 
+0

謝謝cdarke - 問題解決了! –