我尝试使用以下 crontab 命令每天更新我的代码库。但是当我测试它时,第一步本身不起作用。
27 15 * * * . cd /home/covuser/user/ && . /home/covuser/user/conf.sh
40 17 * * * . cd /home/covuser/user && . /home/covuser/user/checkout.sh
conf.sh 包含使代码检出所需的环境变量。checkout.sh 文件执行检出过程。
第一行应该设置所需的环境变量。但是并没有发生。
这其中有什么错误?提前致谢。
答案1
crontab 中的每一行代表一个单独的作业,将被独立安排和执行。
在您的情况下,这尤其意味着它们在不同的 shell 会话中运行,以便在一个作业中获取脚本文件来设置一些环境变量不会影响另一个作业稍后运行的环境。
您必须更改您的流程并将两个脚本放在同一个 shell 会话中运行,因此最容易的是在同一个 cron 作业中运行。
如果您需要在运行之间延迟,您可以通过例如sleep
而不是在固定的稍后时间安排不同的作业来实现。
哦,当然,正如其他一些评论和答案所指出的那样,您只能使用 source 脚本来.
使它们在当前 shell 环境中运行,而不是在子 shell 中运行。但是,cd
不是脚本,而是内置的 shell 命令,它无论如何总是在当前 shell 环境中运行,因此写入. cd somehwere
也是错误的。
答案2
我认为问题出在.
你前面的cd
。
.
(别名 fro source
) 允许您获取文件。这不适用于 shell 内置命令,例如cd
,因为它们不是可以获取的可执行文件。
当您使用 AND - 连接两个命令时&&
,shell 将跳过失败命令后面的任何命令,因为它们不会更改结果值 ( )。如果您希望实现其他行为,false && true == false
可以将 替换&&
为。;
这应该有效:
27 15 * * * cd /home/covuser/user/ && . /home/covuser/user/conf.sh
40 17 * * * cd /home/covuser/user && . /home/covuser/user/checkout.sh
更新:如果脚本相互依赖(我认为它们相互依赖?),则在一个会话中运行所有内容。(将打开一个新的 bash 会话来执行每个 cron 条目)
27 15 * * * cd /home/covuser/user/ && . /home/covuser/user/conf.sh && . /home/covuser/user/checkout.sh