这是我存储在 Github 帐户中的 crontab 模式:
source ~/.profile
0 0 * * *
# More cron commands
作为练习,我尝试将 stdout 数据通过管道传输curl
到我的 crontab 中(我已将 Github 路径更改为通用模式)。
1)我尝试使用一个简单的管道:
curl https://raw.githubusercontent.com/user/repo/master/cronjobs | crontab
此操作失败并出现以下错误:
"-":0: 糟糕的一分钟
crontab 文件错误,无法安装。
2)我尝试使用定界符:
curl https://raw.githubusercontent.com/user/repo/master/cronjobs | cat > crontab
此操作失败并出现以下错误:
没有进行任何修改
3)我尝试将curl
输出回显到crontab
.
echo "curl $(https://raw.githubusercontent.com/user/repo/master/cronjobs)" | crontab
此操作失败并出现以下错误:
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0...: command not found
100 505 100 505 0 0 804 0 --:--:-- --:--:-- --:--:-- 804
(23) Failed writing body
您可以看到我尝试了三种不同的方法将数据从 stdout 发送到 crontab,但没有任何效果。如果我想将其直接传递给 crontab 而不是cron.d
文件,我还剩下什么?
答案1
"-":0: bad minute
errors in crontab file, can't install.
crontab
如果给出的文件/数据不是正确的 crontab 文件,则会出现此错误。 (我认为那里的数字是一个行号,但我不知道为什么它有时显示零。)手册页crontab(5)
说:
crontab 中的活动行可以是环境设置,也可以是 cron 命令。环境设置的形式如下:
name = value
其中等号 (=) 周围的空格是可选的...cron 命令的格式类似于 V7 标准,具有许多向上兼容的扩展。每行有五个时间和日期字段,后跟一个用户名(如果这是系统 crontab 文件),然后是一个命令。
因此,您输入的内容可能不是其中任何一个。
还行吧:
$ crontab <<EOF
SHELL=/bin/bash
* * * * * echo foo
EOF
这不是:
$ echo "foo" |crontab
"-":1: bad minute
errors in crontab file, can't install.
2)这不是一个here-doc,只是一个带有额外cat的管道和一个到文件的重定向crontab
。这不会运行名为 的命令crontab
。
curl https://raw.githubusercontent.com/user/repo/master/cronjobs | cat > crontab
3) 这应该会给你一个来自 shell 的错误,你可能没有名为 的命令https://raw.githubusercontent.com/user/repo/master/cronjobs
。
echo "curl $(https://raw.githubusercontent.com/user/repo/master/cronjobs)" | crontab
答案2
第一行,
source ~/.profile
不是 crontab 中的有效行:
$ echo "source ~/.profile" | crontab
"-":0: bad minute
errors in crontab file, can't install.
如果您想像~/.profile
运行登录 shell 一样获取源代码,请考虑将 shell 脚本启动为
0 0 * * * bash -l /path/to/script.sh
代替(用于bash
,用于sh -l
)/bin/sh
,或者可能
SHELL=/bin/bash
0 0 * * * source ~/.profile && bash /path/to/script.sh
不过,想要~/.profile
在 cron 作业中获取资源是不寻常的。如果您有需要在脚本中设置的特定环境变量(或变量集),最好在脚本中设置它们以保持脚本自包含。
另一种方法是使用单独的环境文件并启动脚本,例如
0 0 * * * BASH_ENV="$HOME/script.env" /path/to/script.sh