我想使用 设置一个 cron 作业crontab -e
。此作业需要以 root 身份执行,因此我认为只需在 中添加一个条目sudo crontab -e
就足够了。不幸的是,事实并非如此。
如果我直接输入以下内容,我需要执行的脚本就可以很好地运行:
sudo /home/user/./script.sh
我以用户身份登录机器user
,我的 crontab 条目(sudo crontab -e
)如下所示:
*/1 * * * * /home/user/./script.sh
那么,我在这里错过了什么?我觉得这个问题与当前用户的权利或类似的东西有关。
首先,我能够摆脱需要 root 权限才能执行脚本的需要。我的crontab
输入(经典,crontab -e
因为我不再需要 root 权限)每分钟运行一次,并且是:
* * * * * /home/user/script.sh
我的script.sh
:
#!/bin/bash
set -e
# Other stuff
再次,它在手动输入时有效./script.sh
,但不是通过创建的 cron 作业来工作。
我知道有证据表明该脚本是由 cron 作业执行的。我按照注释中的建议将错误重定向到文件上,并在其中收到以下错误:
python: can't open file 'get-status.py': [Errno 2] No such file or directory
为了解释这一点,在我的某个时候script.sh
,我使用docker来执行一些其他脚本:
docker run -v $PWD:/t -w /t [image] [command] get-status.py
再次手动操作(./script.sh
)但不是来自 cron 任务。
因此,我发现了问题:
docker run -v $PWD:/t [...]
将当前目录的内容复制到docker容器中。由于它是从cron作业执行的,因此当前目录当然不是好的目录,因此出现异常file not found
。
我发现这样做很难看,docker run -v /home/user/:/t [...]
还有其他方法吗?
虽然这个问题被标记为重复,但这不是同一个问题。PATH
我的脚本中有一个问题,并且必须对其进行修改,因为它是由一个获取$PWD
脚本路径的 cron 作业触发的。
请参阅我自己的答案。
答案1
我的问题主要在于PATH
我在 cron 作业中定义的一个问题。cron
作业用于触发作业,该作业将复制当前的通过 目录进入 docker 容器docker run -v $PWD:/t [...]
。
由于 cron 任务不是从正确的目录触发的,我不得不修改脚本中的路径,告诉 docker 不要使用当前的目录,但脚本所在的目录居住.
正如本文所指出的回答,我把这些行修改为:
SCRIPT=$(readlink -f "$0")
SCRIPTPATH=$(dirname "$SCRIPT")
docker run -v $SCRIPTPATH:/t [...]