我有一个脚本,我使用 cronjob 每 10 分钟调用一次:
*/10 * * * * ~/mydirectory/myscript.sh
现在,里面~/mydirectory
还有另一个脚本,让我们说myotherscript.sh
我想从里面调用它myscript.sh
。这两个脚本都已被chmod
编辑为可执行文件,当我myscript.sh
从命令行执行时,~/mydirectory
一切正常。我执行如下:
。 myscript.sh
但看起来 cronjob 不起作用。当我从主脚本内部删除对第二个脚本的引用时,它仍然有效,所以我怀疑我引用第二个脚本的方式有问题。内容myscript.sh
如下:
#! /bin/bash
do-something
do-something-else
. myotherscript.sh
难道是当 cronjob 运行时,当前目录不在~/mydirectory
,所以 cronjob 找不到该myotherscript.sh
文件?如果是这样,我如何让它看到该文件?我不想指定主脚本内的绝对路径,因为我可能想myotherscript.sh
在某个时刻将其(和)移动到另一个目录,或者我可能想~/mydirectory
在某个时刻重命名,然后我不想更改的内容myscript.sh
来引用新的绝对路径。
额外问题:现在,当 cronjob 执行时,我基本上只是抱着大拇指并希望最好的结果,但我无法知道它是否成功,如果失败,为什么失败。有关如何查看 cronjob 未按预期执行的原因的任何提示?
答案1
好的,所以格伦·杰克曼的答案有效,它也回答了我的额外问题,但我后来想出了另一种我认为更优雅的方法来确保 cronjob 在脚本所在的目录中运行。
只需更换
*/10 * * * * ~/mydirectory/myscript.sh
和
*/10 * * * * cd ~/mydirectory && ./myscript.sh
这样就解决了问题。一切正常。
答案2
您错误地调用了脚本。它应该是:
#! /bin/bash
do-something
do-something-else
./myotherscript.sh;
答案3
myscript
应该有:
cd "$(dirname "$0")"
. ./myotherscript.sh
当 cron 启动脚本时,$PWD 可能是/
这样,如果您想使用相对路径,您应该转到脚本所在的位置。
您可能会发现记录脚本的输出很有用:
*/10 * * * * ~/mydirectory/myscript.sh 2>&1 | /usr/bin/ts '[%FT%T]' >> ~/mydirectory/myscript.log
ts
为每行输入添加时间戳。在 Fedora 和 Ubuntu 上,它位于moreutils
软件包中。
答案4
在 crontab 中定义 PATH 和 MAILTO 应该会有所帮助。