我正在尝试在 crontab 中的变量中使用变量:
AUTH=user:password
BASE_URL=http://...
COMMAND_OLDB=curl -u $AUTH $BASE_URL/openligadb >> /var/log/cron.openligadb.log
但只是收到一封邮件/var/mail/root
:
X-Cron-Env: <BASE_URL=http://...>
X-Cron-Env: <AUTH=user:password>
X-Cron-Env: <COMMAND_OLDB=curl -u $AUTH $BASE_URL/openligadb >> /var/log/cron.openligadb.log>
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/root>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=root>
Message-Id: <...>
Date: Mon, 9 Feb 2015 20:10:01 +0100 (CET)
Enter host password for user '$AUTH':
curl: (6) Couldn't resolve host '$BASE_URL'
curl: (6) Couldn't resolve host '>>'
curl: (3) <url> malformed
/var/log/cron.openligadb.log
本身为空。
$AUTH
以及$BASE_URL
在中无法解析$COMMAND_OLDB
。为什么以及如何修复?
答案1
根据 crontab 手册页 ( man 5 crontab
)
- 如果您设置变量,这些将是环境变量(只要您不覆盖其他环境变量就可以)
- 此类变量的值未经解析,替换将不起作用
因此,您可以定义AUTH
,BASE_URL
但不能定义COMMAND_OLDB
基于其他变量的,因为这些变量不会被替换。只需将命令放在 crontab 行中,如下所示(当然使用您的时间间隔)
*/10 * * * * curl -u $AUTH $BASE_URL/openligadb >> /var/log/cron.openligadb.log
但不是这样的
*/10 * * * $COMMAND_OLDB
答案2
crontab
有两种类型的语句(参见man 5 crontab
):
- 环境设置(例如
SHELL=/bin/bash
) - cron 命令(例如
* * * * * /path/to/cmd
)
环境设置行不会进行变量替换(例如PATH=/usr/bin:$PATH
),但 cron 命令行会。因此,您可以将变量替换行放在 cron 命令中,而不是环境设置中。
AUTH=user:password
BASE_URL=http://...
* * * * * COMMAND_OLDB="curl -u $AUTH $BASE_URL/openligadb" ; $COMMAND_OLDB >> /var/log/cron.openligadb.log
注意:这个答案更多的是出于教育目的,以演示如何做到这一点。丹的回答是更实际的答案。