root cron 中的集群命令不会执行

root cron 中的集群命令不会执行

root我的 Debian 上的 crontab中有以下代码

* * * * * flock -xn /absolute/path/to/run.lock -c cd /absolute/parth/to/project && ./run >> run.log

但我在指定的地方没有看到run.log任何文件。run.lock事实上,没有证据表明该脚本已被执行。

运行ps aux | grep run只会产生该grep调用。

如何在根目录中运行run脚本?flockcrontab

答案1

crontab 行中的命令没有按照您期望的方式进行解析。

cron 守护进程将使用为相关用户配置的 shell 运行命令。

第一个 shell 将看到两个命令,由&&控制运算符分隔。因此,仅当第一个命令以零返回代码退出(表明成功)时,才会执行第二个命令。

第一个命令是:flock -xn /absolute/path/to/run.lock -c cd /absolute/path/to/project

第二个命令是:./run >> run.log

第一个命令将创建锁定文件并cd作为子进程(即在 shell 的另一个实例中)运行该命令。不带参数的命令cd将更改为用户的主目录,之后执行的 shellflock将立即退出。这将等于完全没有效果。

即使使用路径名,cd /absolute/path/to/project此处的命令也不会对该命令的工作目录产生任何影响flock,也不会对该 shell 的第一个实例执行的第二个命令产生任何影响。这是因为该cd命令仅影响它运行的特定 shell 实例,而不影响其父实例。

/absolute/path/to/project视为flock命令的额外文件名,而不是cd.

由于第一个命令已退出并且未报告任何错误,因此 shell 的第一个实例(最初由cron守护程序启动)现在将运行第二个命令。由于该 shell 的工作目录没有更改,它仍然是用户的主目录root,因此它最终会尝试执行有效的内容/root/run >>/root/run.log

我的猜测是你的意思可能是这样的:

* * * * * flock -xn /absolute/path/to/run.lock -c "cd /absolute/path/to/project && ./run >> run.log"

引号将阻止第一个 shell 在 处分割命令行&&,因此第二个 shell(由该flock命令启动)将获取整个剩余命令行,因此该cd /absolute/path/to/project命令将./run在项目目录中运行之前有意义地执行。

相关内容