在Shell脚本中计数进程



可能的重复:
快速和划线的方法可以确保一个shell脚本的一个实例

我是Shell脚本的新手。

我想做的是避免运行脚本的多个实例。

我有这个shell脚本cntps.sh

#!/bin/bash
cnt=`ps -e|grep "cntps"|grep -v "grep"`
echo $cnt >> ~/cntps.log
if [ $cnt < 1 ];
then 
    #do something.
else
    exit 0
fi

如果我以这种方式运行$./cntps.sh,它会回荡2

如果我以这种方式运行$. ./cntps.sh,它会回荡0

如果我使用crontab运行它,它会回荡3

有人可以向我解释为什么会发生这种情况?避免运行脚本多个实例的正确方法是什么?

我将您的命令稍微更改为输出 ps,以便我们看到正在发生的事情。

cnt=`ps -ef| tee log | grep "cntps"|grep -v "grep" | wc -l`

这就是我看到的:

32427 -bash
  20430 /bin/bash ./cntps.sh
    20431 /bin/bash ./cntps.sh
      20432 ps -ef
      20433 tee log
      20434 grep cntps
      20435 grep -v grep
      20436 wc -l

您可以看到,我终端的外壳(32427)产生了一个新的外壳(20430)来运行脚本。然后,脚本催生另一个子弹(20431)进行命令替代(`ps -ef | ...`)。

所以,两个计数是由于:

  20430 /bin/bash ./cntps.sh
    20431 /bin/bash ./cntps.sh

无论如何,这不是确保只有一个过程正在运行的好方法。改为看到这个问题。

首先,我建议使用pgrep而不是此方法。其次,我认为您缺少wc -l来计算脚本中的实例

回答您的计数问题:

如果我以这种方式运行$./cntps.sh,它会呼应2

这是因为回头呼叫:ps -e ...正在触发一个子壳,该子壳也称为cntps.sh,这触发了两个项目

如果我以这种方式运行$. ./cntps.sh,它会回荡0

这是由于您不运行而引起的,但实际上是将其采购到当前运行的外壳中。这会导致没有由名称cntps

运行的脚本的副本

如果我使用crontab运行它,它会呼应3

来自调用的两个,一个来自 sh -c 'path/to/cntps.sh'

的crontab调用本身

请参阅此问题,以了解如何执行单个实例shell脚本。

使用"锁"文件

if(exists("lock") == false)
{
    touch lock file // create a file named "lock" in the current dir
    execute_script_body // execute script commands
    remove lock file // delete the file
}
else
{
    echo "another instance is running!"
}
exit

相关内容

  • 没有找到相关文章

最新更新