2011-09-09 168 views
2

bash脚本如何确保不超过一个副本运行?bash脚本如何确保不超过一个副本运行?

我曾尝试:

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

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

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

那么它的节目。然而,如果我再vim /user/loca/shell/sh,然后执行:

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

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

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

+0

为/用户/ LOCA /壳/ sh的脚本或编译的可执行文件?我怀疑你需要更仔细地搜索ps输出。请在运行和编辑时显示ps输出。 –

+0

是的,他们正在运行和执行... – joe

+0

请显示ps输出 –

回答

7

Unix守护进程中经常使用的惯用法是在启动时创建一个带有PID的文件。

然后,您可以在启动时检查文件的存在和/或内容,如果存在,则退出并保持该实例运行。

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

唯一的问题出现在脚本运行时,但由于某种原因没有完成,导致PID文件存在。这可以通过检查它的时间戳来处理,如果它太早以前,你认为它是一个中止运行并继续当前运行。

+1

删除文件使用'trap'rm $ PID_FILE“EXIT” –

+1

而不是不可靠的pid文件时间戳方法,更好的方法是检查pid是否正在使用并匹配脚本名称。 – jlliagre

+1

此外,守护进程可以检查记录在PID文件中的进程是否仍然存在。如果过程PID存在,'kill -0 PID 2>/dev/null'命令将报告成功,否则将失败。 –

0

尝试p纤ep,而不是在你的脚本“PS -ef ...”:

pgrep /usr/loca/shell/sh 

如果这是行不通的话,我会诉诸试图通过创建脚本的符号链接锁如果还没有存在,如果它已经存在,则退出并在退出时删除它。创建符号链接是unix上的一项原子操作,可用作穷人对shell脚本的锁定。

0

我用一个文件锁:

MY_LOCK_FILE='whatever.lock' 

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