将卷曲标准输出回显到 crontab

将卷曲标准输出回显到 crontab

这是我存储在 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

相关内容