
Я хочу записать свой публичный IP в файл с помощью cron. Что-то вроде этого:
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
*Должен быть более элегантный способ обработки форматирования. То, что я frankensteind, кажется довольно неловким.
решение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 -l
* * * * * ~/crontab.ip
Он должен работать.
решение3
При размещении команд в системе cron необходимо использовать полный путь к команде.
Т.е.,
датадолжно быть/bin/дата
трдолжно быть/usr/bin/tr
завитокдолжно быть/usr/bin/curl.
эходолжно быть/usr/bin/echo