从其他脚本内部调用脚本

从其他脚本内部调用脚本

我有一个脚本,我使用 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 应该会有所帮助。

相关内容