用户 crontab 条目内容如下:
0 */4 * * * $HOME/postscript/fprogcache-sync
运行良好。我想向 cron-job 上下文添加一些环境变量,然后我尝试
0 */4 * * * source $HOME/.profile; $HOME/postscript/fprogcache-sync
source
直到我将其更改为,它才起作用.
。错误消息(由 postfix 邮件发送给 root)是/bin/sh: 1: source: not found
,随后确认脚本继续顺利执行。
我记得在某处读到过它被定义为bash shell 中source
内置命令的别名。如果是这样,那就可以解释为什么在 cron 上下文中无法识别它。 .
source
是这样的吗?如果是这样,那么系统范围的别名.
定义在哪里?
答案1
是这样的吗?如果是这样,那么系统范围的别名
.
定义在哪里?
确实如此,但是不存在系统范围的别名。
.
和source
在 Bash 中是相同的内置函数,但它直接在源代码级别定义(https://askubuntu.com/a/25491/380067)。
同一个内置函数有两个名字的原因很可能在于Bash 的目标是在一定程度上符合 POSIX 标准;因此source
为了提供一个助记名称并.
为了遵守 POSIX 的标准。
source
无法运行的真正原因cron
是,默认情况下,cron
crontab 中的作业是在 中执行的sh
,这是一个符号链接/bin/dash
(一个旨在符合 POSIX 标准的 shell),它根本没有实现source
。然而它确实实现了.
。
从man dash
:
. file
The commands in the specified file are read and executed by the
shell.
答案2
我认为你应该在 bash 上运行你的脚本,尝试这个:
0 */4 * * * /bin/bash -c "$HOME/postscript/fprogcache-sync"
如果您想在命令和调试脚本中添加日志,请像这样添加日志:
0 */4 * * * /bin/bash -c "$HOME/postscript/fprogcache-sync" > /var/log/automatic_backup.log 2>&1