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
脚本?flock
crontab
答案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
在项目目录中运行之前有意义地执行。