【问题标题】:Is it ok to use check PID for rare exceptions?对罕见的异常使用检查 PID 可以吗?
【发布时间】:2017-05-08 07:40:15
【问题描述】:

我读过this interesting question,基本上说我应该始终避免达到不是子进程的进程的PID。解释得很好,很有意义。

但是,虽然 OP 试图做一些 cron 不打算做的事情,但我的情况却截然不同:

  1. 我想每 5 分钟运行一次进程,但一百次运行一次需要 5 分钟多一点(而且我不能同时运行两个实例)。
  2. 我不想杀死或操纵其他进程,我只想在进程的另一个实例正在运行时结束我的进程而不做任何事情。

在这种情况下可以获取“非子进程”的 PID 吗?如果是这样,我该怎么做?

我尝试过if pgrep "myscript"; then ... 或类似的东西,但该进程找到了自己的PID。我需要检测它是否找到多个


(最初在被重定向之前我阅读了this question,但给出的解决方案不起作用:它可以提供使用它的进程的pid)

编辑:我之前应该提到过,但是如果脚本已经在使用,我仍然需要在日志文件中写一些东西,至少:date>>script.log; echo "Script already in use">>script.log",我可能错了,但是我认为flock不允许这样做。

【问题讨论】:

  • 基本上,您要确保在任何时候都只有一个流程实例。我建议使用锁定文件来实现互斥。请参阅此问题以进行与锁定相关的讨论:stackoverflow.com/questions/41275785/…
  • @codeforester 每次调用脚本时,我都会在日志文件中写入一些内容。如果脚本被锁定,我不能写日期+“脚本已在使用”,可以吗?

标签: bash scripting cron


【解决方案1】:

使用lckdoflock 避免重复运行。

DESCRIPTION
       lckdo runs a program with a lock held, in order to prevent multiple
       processes from running in parallel. Use just like nice or nohup.

       Now that util-linux contains a similar command named flock, lckdo is
       deprecated, and will be removed from some future version of moreutils.

当然你可以自己实现这个原始的锁文件功能。

if [ ! -f /tmp/my.lock ];then
     touch /tmp/my.lock
     run prog
     rm -f /tmp/my.lock
fi

【讨论】:

  • 你的“实现”有竞争条件。
  • 这只是一个展示方式的例子。他应该使用flocklckdo
  • 然后编辑问题。该代码很危险,因为它大部分的时间都会起作用。
  • 你能解释一下这个实现的竞争条件吗?我错过了这里可能出错的地方。 (假设我只会从 cron 调用它)
  • 很公平。但是在这种情况下,该进程仅由 cron 调用,每五分钟一次,因此不会发生此问题。我知道它可以在其他情况下,但不是在我的情况下,所以我为什么要编辑这个问题?
猜你喜欢
  • 2013-09-23
  • 1970-01-01
  • 1970-01-01
  • 2020-08-29
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多