我编辑了我的 crontab 并奇怪地开始收到“错误:糟糕的一分钟”。环顾四周,我发现原因是错误的控制字符。我可以看到每行末尾的字符,但我不知道如何删除它。$
我没有做任何特别的事情,只是用来crontab -e
编辑启动的条目vi
(vi
就像编辑器一样)。那么,这些内容如何$
出现在我的文件中,以及如何删除它们?
fwiw,我使用的是 Maczsh
更新:添加了有问题的内容crontab
。见下文
所以,我发布了一个xy
令人尴尬的问题。尽管如此,我的“糟糕的一分钟”问题仍然存在。这是有问题的crontab
HOME=/Users/punkish
APPDIR=Projects/zenodeo3
export NODE_ENV=cron
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
0 0 * * * cd $HOME/$APPDIR && bin/cron-truebug.sh
那应该在那里。末尾
$
的cat -e
表示换行符(LF 字符)。“糟糕的一分钟”是由其他原因引起的。这个 crontab 的问题与奇怪的字符无关,而与根本不遵循 crontab 语法的条目有关。crontab 不是 shell 脚本- 每个“作业”都包含一个脚本,但 crontab 作为一个整体不是,并且您不能将 shell 命令或构造放在顶层。
也就是说,你不能将类似
[ ... ]
或. nvm.sh
的内容放入你的 cronjob 中——你可以将其作为每个单独工作的一部分来执行,但不能全局执行。除了实际的作业条目之外,其中唯一允许的就是
ENV=value
像第 1-2 行中那样的简单分配(它们是隐式“导出”的,因此export
无论如何都不需要该命令)。这看起来像脚本中的情况只是巧合。除了这些分配之外的任何其他内容都被假定为工作规范行,因此会出现“错误分钟”消息,因为第 3-6 行中的第一个字段(即或
export
)[
确实不是分钟规范。如果你的 crontab 看起来像这样,它就会工作:
(我省略了 HOME= 因为 cron 作业已经知道这一点,并省略了 bash_completion 因为它只在交互式shell 中有用 - 将它作为脚本的一部分加载是没有意义的。我可能还会删除该
[ -s ]
检查;如果您已经设置了你可能可以假设 nvm 的存在。)如果这作为 cronjob 看起来太笨拙,请创建一个专用的 shell 脚本来设置所有必要的环境并将其作为作业运行:
当您在 macOS 上时,您还可以选择使用 launchd(Linux 类似地也有 systemd 计时器)。