Как мне отладить неудачное задание cron с использованием netcat?

Идея использования crontab для планирования команд netcat на двух машинах была поднята в этом вопросе , но все респонденты упрекали спрашивающего и перешли к обсуждению scp .

Если я в порядке с последствиями, как я могу найти, что пошло не так с этой настройкой? В целях тестирования я синхронизировал эти два задания в 13:45 по местному времени. Оба компьютера находятся в одном часовом поясе.

Целевой crontab:

45 13 * * * nc -l -p 1234 > /path/to/backup-$(date +%F).tar.bz2

Исходный crontab:

45 13 * * * /path/to/backup_script.sh

Исходный сценарий резервного копирования:

sleep 5  # to ensure the destination is already listening
tar -cvpj --exclude-vcs /path/to/source/files | nc -N dest 1234

Сами по себе (вне crontab) команда прослушивания и сценарий резервного копирования работают. Насколько я понимаю, пункт назначения не перестанет слушать, пока не получит EOF. Однако кажется, что слушающая сторона не слушает, когда она должна быть. Я могу запустить его прослушивание вручную, и запланированное задание источника отправит файл, но я не могу получить адрес назначения для прослушивания в указанное время.

0
задан 27 November 2020 в 01:03

2 ответа

Команды

crontab ( man -a crontab ) НЕ являются bash . Перенаправление и подстановка команд недоступны в командах crontab .

Оберните нужную команду в сценарий bash , начиная с #! / Bin / bash , и вызовите сценарий из записи crontab .

0
ответ дан 3 January 2021 в 22:48

Как описано в man 5 crontab , символ % является специальным в crontabs и должен экранироваться

  Знаки процента (%)  в команде,
  если не экранировать с помощью обратной косой черты (\), будет заменен на символ новой строки
  ters, и все данные после первого% будут отправлены команде как
  стандартный ввод.  Невозможно разделить одну командную строку на
  несколько строк, например завершающий символ "\" оболочки.
 

, поэтому ваша команда должна быть записана как

45 13 * * * nc -l -p 1234 > /path/to/backup-$(date +\%F).tar.bz2

В противном случае % рассматривается как символ конца строки, а команда, переданная оболочке, усекается, например nc - l -p 1234> / path / to / backup - $ (date + , что, очевидно, является синтаксической ошибкой.


Примечание: поскольку вопрос в том, «как отлаживать», вы могли бы диагностировать это, посмотрев на записи журнала для службы cron, например

journalctl -xeu cron | grep CMD

, где вы могли бы заметить усеченную команду.


Хотя файлы crontab сами по себе не являются сценариями оболочки, командная часть каждой записи crontab передается в shell. Снова из man 5 crontab :

  Вся командная часть строки, вплоть до новой строки или%
  символ, будет выполняться / bin / sh или оболочкой, указанной в
  Переменная SHELL файла crontab.
 

Поскольку значение по умолчанию - / bin / sh , оно будет принимать любые функции оболочки POSIX, включая перенаправления, такие как < > >> , а также ] $ (...) конструкция подстановки команд. Если вы не измените SHELL соответствующим образом, он не будет работать с перенаправлениями, специфичными для bash, такими как &> . Таким образом, при переносе вашей команды в отдельную оболочку сценарий исправит ошибку, потому что он перемещает символ % за пределы crontab.

0
ответ дан 3 January 2021 в 22:48

Другие вопросы по тегам:

Похожие вопросы: