我想使用 cron 将我的公共 IP 记录到文件中。像这样的东西:
2021-05-17T01:11:46 99.99.99.99
2021-05-17T01:12:46 99.99.99.99
2021-05-17T01:13:46 99.99.99.99
这是我拼凑起来的:
* * * * * { date +%FT%T | tr "\n" " "; curl https://ipinfo.io/ip -s ; echo "" ; } >> /home/mario/logs/pubip.log
它在 sh 提示符下工作*,但是一旦我将星号放在前面并将其放入 crontab -e 中,我会收到以下错误:
/bin/sh: 1: Syntax error: end of file unexpected (expecting "}")
操作系统:Ubuntu 20.04.2 LTS
*必须有一种更优雅的方式来处理格式。我觉得弗兰肯斯坦很尴尬。
答案1
所以原来是‘%’符号。应该更多地阅读文档:crontab(5)
The "sixth" field (the rest of the line) specifies the command to
be run. The entire command portion of the line, up to a newline
or a "%" character, will be executed by /bin/sh or by the shell
specified in the SHELL variable of the cronfile. A "%" character
in the command, unless escaped with a backslash (\), will be
changed into newline characters, and all data after the first %
will be sent to the command as standard input.
最终有效的正确 cron 行是
* * * * * { date +\%FT\%T | tr "\n" " "; curl https://ipinfo.io/ip -s ; echo "" ; } >> /home/mario/logs/pubip.log
也就是说,我将按照 @scimerman 的建议将其移至脚本中,以提高可读性。
答案2
我无法重现你的。如果 cron 命令太庞大,更优雅的方法是将其包装在单独的 cron 脚本中并从 crontab 调用它:
$ cat ~/crontab.ip
#!/bin/bash
{ date +%FT%T | tr "\n" " "; curl https://ipinfo.io/ip -s ; echo "" ; } >> ~/log.ip
我的 crontab 是:
$ crontab -l
* * * * * ~/crontab.ip
它应该有效。
答案3
将命令放入 cron 系统时,必须使用命令的完整路径。
IE,
日期应该/bin/日期
t应该/usr/bin/tr
卷曲应该/usr/bin/curl。
回声应该/usr/bin/echo