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脚本如何检查进程是否正在运行?
答案 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"