root cron 中的 flock 命令不会执行

Use*_*ame 0 linux cron debian

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

* * * * * flock -xn /absolute/path/to/run.lock -c cd /absolute/parth/to/project && ./run >> run.log
Run Code Online (Sandbox Code Playgroud)

但我没有看到run.logrun.lock文件,其中我指定它们。事实上,没有证据表明脚本被执行了。

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

如何在 root 中运行run脚本?flockcrontab

tel*_*coM 5

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此处的命令也不会对命令的工作目录产生任何影响,也不会对flockshell 的第一个实例执行的第二个命令产生影响。这是因为该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"
Run Code Online (Sandbox Code Playgroud)

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