Bash 变量更改不会持续存在



我有一个简短的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"

相关内容

  • 没有找到相关文章

最新更新