bash脚本来监控自己

时间:2013-05-08 12:54:11

标签: bash daemon process-monitoring

我需要开发一个shell脚本,如果它们的另一个实例正在运行则不会启动。

如果我构建一个监视自己的test.sh,我需要知道它是否已经在运行然后中止,否则(如果之前没有运行)我可以运行

#!/bin/bash

loop() {
    while [ 1 ]; do
        echo "run";
        #-- (... omissis ...)
        sleep 30
      done
 }

 daemon="`/bin/basename $0`"

 pidlist=`/usr/bin/pgrep $daemon | grep -v $$`
 echo "1:[ $pidlist ]"

 pidlist=$(/usr/bin/pgrep $daemon | grep -v $$)
 echo "2:[ $pidlist ]"

 echo "3:[ `/usr/bin/pgrep $daemon | grep -v $$` ]"

 echo "4:["
 /usr/bin/pgrep $daemon | grep -v $$
 echo "]"

 if [ -z "$pidlist" ]; then
      loop &
 else
      echo "Process $daemon is already running with pid [ $pidlist ]"
 fi

 exit 0;

当我第一次运行上面的脚本时(之前的实例没有运行),我得到了这个输出:

1:[ 20341 ]
2:[ 20344 ]
3:[ 20347 ]
4:[
]

我无法理解为什么只有第四次尝试不会返回任何东西(如预期的那样)。我的剧本有什么问题? 我是否必须在临时文件上重定向第4个命令的输出,然后查询该文件以确定是否可以运行(或不运行)循环函数?

谢谢任何人都会帮助我!

1 个答案:

答案 0 :(得分:0)

子shell ...前三个在子shell中运行,因此$$已更改为子shell的PID。

尝试使用:

PID=$$
pidlist=`/usr/bin/pgrep $daemon | grep -v $PID`
echo "1:[ $pidlist ]"

等。由于$PID的值是在运行子shell之前建立的,因此对于所有命令应该是相同的。

这个过程是否足够受欢迎,以至于其他人想要在机器上运行相同的守护进程?也许你的机器上没有多个用户,但请记住其他人可能也想要运行该命令。