首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检测脚本是否已经在bash脚本中运行,如果没有重新启动

检测脚本是否已经在bash脚本中运行,如果没有重新启动
EN

Stack Overflow用户
提问于 2022-06-08 06:31:02
回答 1查看 77关注 0票数 0

我正在尝试编写一个脚本,它将检查脚本是否已经在运行,而不是在cron上运行它,如果它仍然从上一次运行。我在这里发现了另一篇文章,他们建议使用:

代码语言:javascript
复制
echo `pgrep -f $0` . "!=" . "$$";
if [[ `pgrep -f $0` != "$$" ]];

虽然当我在SSH中手动运行它时,这似乎是有效的,但是当通过cron运行时,它会产生奇怪的结果:

14767 14770。!=。14770

这是因为有两个进程使用两个不同的pid运行吗?

我想出了一个替代方案:

代码语言:javascript
复制
if [ -n "$(ps -ef | grep -v grep | grep 'run.sh' | wc -l)" > 2 ];
then
    echo "already running"
else
  # do some stuff here
fi

单独运行命令似乎像预期的那样工作:

代码语言:javascript
复制
# ps -ef | grep -v grep | grep 'run.sh' | wc -l)
2

但是,在代码中,它总是显示“已经在运行”,即使没有满足我的条件:

代码语言:javascript
复制
bash run.sh
2
already running

也许我把变量做错了吗?

更新:按照建议,我正在尝试flock

代码语言:javascript
复制
#!/bin/bash

[ "${FLOCKER}" != "$0" ] && exec env FLOCKER="$0" flock -en "$0" "$0" "$@" || :

#... rest of code here

但我明白:

flock:未能执行run.sh:没有这样的文件或目录

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-08 06:47:38

您可以这样编写代码,但它将非常复杂且容易出错。最好使用文件锁定。为此存在flock命令。它的手册提供了各种可以剪切和粘贴的示例,包括:

代码语言:javascript
复制
#!/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提供详细信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72541030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档