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.log或run.lock文件,其中我指定它们。事实上,没有证据表明脚本被执行了。
运行ps aux | grep run只会产生那个grep调用。
如何在 root 中运行run脚本?flockcrontab
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在项目目录中运行之前被有意义地执行。
| 归档时间: |
|
| 查看次数: |
404 次 |
| 最近记录: |