我有一个简短的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
Run Code Online (Sandbox Code Playgroud)
输出我得到的,当Python脚本的运行,是:
RUNNING: 1
Running: 0
Run Code Online (Sandbox Code Playgroud)
并且bash脚本的退出值为0.因此isRunning在所有if语句中都会发生变化(即代码按预期执行),但之后某种程度上运行会再次恢复为0.困惑...
管道之后的命令在|子shell中运行.子shell中对变量值的更改不会传播到父shell.
解决方案:将循环更改为
while read PID; do
# ...
done < $PIDFILE
Run Code Online (Sandbox Code Playgroud)