我的 cron 命令不起作用

ahm*_*mad 3 command-line cron

运行的命令source不起作用。

crontab -e


*/1 * * * * echo "1" > $HOME/cron && source $HOME/.zshrc && echo "2" >> $HOME/cron2 && source /home/alux/gitHub/rememberMe/.venv/bin/activate && echo "3" >> $HOME/cron && python /home/alux/gitHub/rememberMe/rememberMe/manage.py runcrons > /home/alux/gitHub/rememberMe/rememberMe/cronjobs.log && echo "4" >> $HOME/cron
Run Code Online (Sandbox Code Playgroud)

cron 文件的内容是1.

hee*_*ayl 7

sourcebash-ism(或zsh-ism),而默认情况下cron使用sh( dash) 作为选择的外壳。

所以你需要使用.而不是source保持POSIX:

. "$HOME"/.zshrc
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用以下SHELL变量将 shell 更改为您想要的任何 shell crontab

SHELL=/usr/bin/zsh
Run Code Online (Sandbox Code Playgroud)

crontab在任何命令条目之前,您需要将它放在 , 的顶部附近。

按照你的例子:

SHELL=/usr/bin/zsh

*/1 * * * * echo "1" > $HOME/cron && source $HOME/.zshrc && echo "2" >> $HOME/cron2 && source /home/alux/gitHub/rememberMe/.venv/bin/activate && echo "3" >> $HOME/cron && python /home/alux/gitHub/rememberMe/rememberMe/manage.py runcrons > /home/alux/gitHub/rememberMe/rememberMe/cronjobs.log && echo "4" >> $HOME/cron
Run Code Online (Sandbox Code Playgroud)

现在你可以坚持你原来的source方法了。

这是针对您的情况的推荐方法 - sourceing .zshrc,大概您zsh在那里有特定的声明,但在sh.

如果您不想设置SHELL变量,您可以将整个命令作为 的参数运行zsh -c,但这会导致小心引用。

更安全的方法是将命令放在脚本中,然后将其作为带有#!/usr/bin/env zshshebang的可执行文件或作为参数运行zsh(不使其可执行)。


作为旁注,除非您有意要对它们进行分词和路径名扩展,否则请始终引用您的变量扩展。