2015-12-03 63 views
2

我想杀死一个进程并删除一个表明进程正在运行的标志。 cron:pkill在crontab中带有-f标志不能在分号后运行命令

00 22 * * 1-5 pkill -f script.sh >log 2>&1 ; rm lock >log 2>&1 

当我在终端上运行它时,它完美的工作。但在crontab rm没有运行。我所能想到的是,在-f标志之后的整行被作为pkill的参数。 为什么会发生这种情况?

保持它们作为单独的cron项正在工作。此外pkill没有-f标志正在运行(尽管它不会终止进程,因为我希望在整个命令中搜索模式)。

回答

1

简单的回答:它只是自杀!

我的答案解释: 如果你让一个命令由一个crond启动它将在一个子shell中执行。最有可能你会在PS或HTOP找到这一行看起来像这样:

/bin/sh -c pkill -f script.sh >log 2>&1 ; rm lock >log 2>&1 

(细节可能会有所不同例如,你可能有bash的,而不是SH)

的一点是,该整行有一个PID(进程ID),并且是使用'-f'参数时pgrep/pkill解析的命令行之一。在手册页指出:现在

-f, --full 
      The pattern is normally only matched against the process name. When -f is set, the full command line is used. 

您pkill的是寻找在运行过程列表,这在某种程度上包含表达式“script.sh”,最终会发现这条线在某些时候任何命令行。作为它发现的结果,它将获得该PID并终止它。不幸的是,同样的PID持有你剩余的命令链,它只是被它自己杀死了。

所以你基本上写了'命令的自杀行';) 顺便说一句:我今天做了同样的事情,那就是我如何找到你的问题。

希望这个答案可以帮助,即使说到有点晚

亲切的问候

1

就遇到了这个问题,今天只是想张贴那些谁碰上这样的工作例如:

pkill -f ^'python3 /Scripts/script.py' > /dev/null 2>&1 ; python3 /Scripts/script.py > /tmp/script.log 2>&1 

运行pkill并搜索以(regex ^python3 /Scripts/script.py开头的整个命令(-f)。因此,它永远不会自杀,因为它不会从该命令开始(它始于pkill)。

0

3.141592 and nanananananananananananaBATMAN的回答是正确的。 我这样解决了这个问题。

00 22 * * 1-5 pkill -f script.[s][h] >log 2>&1 ; rm lock >log 2>&1

这工作,因为script.[s][h](串)不与script.[s][h](正则表达式)匹配。

+0

此变通办法在我的macOS上不需要。在mac上可能'pkill'杀死进程,除了它本身。 – mercy387