Идея использования 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. Однако кажется, что слушающая сторона не слушает, когда она должна быть. Я могу запустить его прослушивание вручную, и запланированное задание источника отправит файл, но я не могу получить адрес назначения для прослушивания в указанное время.
crontab
( man -a crontab
) НЕ являются bash
. Перенаправление и подстановка команд недоступны в командах crontab
.
Оберните нужную команду в сценарий bash
, начиная с #! / Bin / bash
, и вызовите сценарий из записи crontab
.
Как описано в 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.