Crontab 中分号后的命令未执行?

Crontab 中分号后的命令未执行?

这是我的 crontab:

42 17 * * 1-5 /bin/pkill -f 'MyExecutable.exe' ;  touch /tmp/here.log

并且根据/var/log/cron它运行:

May 22 17:42:01 server1 CROND[326732]: (myuser) CMD (/bin/pkill -f 'MyExecutable.exe' ;  touch /tmp/here.log)

而的过程MyExecutable.exe确实消亡了。然而,here.log并不是在中创建的/tmp

如果我在 myuser 下手动运行它:

touch /tmp/here.log

文件已成功创建(因此肯定不是权限问题)。我甚至尝试将其移至touchcrontab 中的单独 cronjob,并且成功了。

touch为什么分号后面不运行?

答案1

这可以通过以下方式复制

sh -c 'pkill -f "MyExecutable.exe" ; touch /tmp/here.log'

Cron 通过将命令传递给 shell(sh或其他)来运行命令,因此实际上它与上面的行非常相似。无论任何MyExecutable.exe命令是否运行,pkill -f都会匹配 shell 并在运行之前将其终止touch。这是因为

该模式通常仅与进程名称匹配。-f设置后,将使用完整命令行。

(来源:man 1 pkill

可能的解决方案:

  1. 如果你不需要-f,就删除它:

    42 17 * * 1-5 /bin/pkill 'MyExecutable.exe' ;  touch /tmp/here.log
    
  2. 如果确实需要-f,请touch在之前运行pkill

    42 17 * * 1-5 touch /tmp/here.log ; /bin/pkill -f 'MyExecutable.exe'
    

答案2

这个问题与这个问题相关:

在 cron 作业中按顺序运行两个命令?

您应该用 && 而不是 ; 来分隔两个命令。

相关内容