我正在尝试编写一个脚本,它将检查脚本是否已经在运行,而不是在cron上运行它,如果它仍然从上一次运行。我在这里发现了另一篇文章,他们建议使用:
echo `pgrep -f $0` . "!=" . "$$";
if [[ `pgrep -f $0` != "$$" ]];虽然当我在SSH中手动运行它时,这似乎是有效的,但是当通过cron运行时,它会产生奇怪的结果:
14767 14770。!=。14770
这是因为有两个进程使用两个不同的pid运行吗?
我想出了一个替代方案:
if [ -n "$(ps -ef | grep -v grep | grep 'run.sh' | wc -l)" > 2 ];
then
echo "already running"
else
# do some stuff here
fi单独运行命令似乎像预期的那样工作:
# ps -ef | grep -v grep | grep 'run.sh' | wc -l)
2但是,在代码中,它总是显示“已经在运行”,即使没有满足我的条件:
bash run.sh
2
already running也许我把变量做错了吗?
更新:按照建议,我正在尝试flock
#!/bin/bash
[ "${FLOCKER}" != "$0" ] && exec env FLOCKER="$0" flock -en "$0" "$0" "$@" || :
#... rest of code here但我明白:
flock:未能执行run.sh:没有这样的文件或目录
发布于 2022-06-08 06:47:38
您可以这样编写代码,但它将非常复杂且容易出错。最好使用文件锁定。为此存在flock命令。它的手册提供了各种可以剪切和粘贴的示例,包括:
#!/bin/bash
[ "${FLOCKER}" != "$0" ] && exec env FLOCKER="$0" flock -en "$0" "$0" "$@" || :
# ... rest of code ...对于shell脚本来说,这是有用的样板代码。将其放在要锁定的shell脚本的顶部,它将在第一次运行时自动锁定自己。如果env var $FLOCKER没有设置为正在运行的shell脚本,那么在使用正确的参数重新执行自身之前,执行flock并获取一个排他的非阻塞锁(使用脚本本身作为锁文件)。它还将絮凝器env设置为正确的值,这样它就不会再次运行。
man flock提供详细信息。
https://stackoverflow.com/questions/72541030
复制相似问题