我有一个简短的bash脚本来检查Python程序是否正在运行。程序在运行时写出一个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.因此isRunning在所有if语句中都会发生更改(即代码按预期执行),但是然后以某种方式isRunning再次恢复为0。困惑...
答案 0 :(得分:6)
管道|
之后的命令在子shell中运行。对子shell中变量值的更改不会传播到父shell。
解决方案:将循环更改为
while read PID; do
# ...
done < $PIDFILE
答案 1 :(得分:0)
管道就是问题所在。以这种方式使用管道意味着循环在子shell中运行,具有自己的环境。杀死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"