bash脚本如何确保运行的副本不多于一个?

时间:2011-09-09 15:27:28

标签: linux bash shell

bash脚本如何确保运行的副本不多于一个?

我试过了:

ps -ef| grep /user/loca/shell/sh | wc -l

由于grep命令,这显示了我2。将其更改为:

ps -ef | grep /user/loca/shell/sh | grep -v 'grep' wc -l 

然后显示1.但是,如果我然后vim /user/loca/shell/sh然后执行:

ps -ef| grep /user/loca/shell/sh | grep -v 'grep' wc -l

显示2.但是只有一个过程,我已经开始了。

bash脚本如何检查进程是否正在运行?

3 个答案:

答案 0 :(得分:7)

Unix守护程序中经常使用的习惯用法是在启动时创建一个包含PID的文件。

然后你可以在启动时检查文件的存在和/或内容,如果它在那里,你退出并让该实例继续运行。

在脚本结束时删除文件,准备下次运行。

脚本运行时出现唯一的问题,但由于某种原因未完成,请保留PID文件。这可以通过检查它的时间戳来处理,如果它是很久以前,你认为它是一个中止的运行并继续当前的。

答案 1 :(得分:0)

在脚本中尝试使用pgrep而不是'ps -ef ...':

pgrep /usr/loca/shell/sh

如果这不起作用,那么我会尝试从脚本创建一个符号链接(如果一个尚不存在)并且如果它已经存在则挽救,并在退出时删除它。创建符号链接是unix上的一个原子操作,可以用作shell脚本的穷人锁。

答案 2 :(得分:0)

我使用文件锁:

MY_LOCK_FILE='whatever.lock'

( if (flock -nx 200); then
      # Do stuff here...
  fi
) 200>"$MY_LOCK_FILE"