我有一个简短的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正在更改,但随后以某种方式再次恢复为0。困惑...
命令在管道|
后运行。子壳中变量值的更改不会传播到父壳。
解决方案:将循环更改为
while read PID; do
# ...
done < $PIDFILE
是问题是管道。以这种方式使用管道意味着循环在具有自己的环境的子壳中运行。杀死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"