Я использую cron на моем безголовом сервере ubuntu 18.04, и следующий cron не будет выполняться:
30 13 * * 6 test $((10#$(date +%W)%4)) -eq 1 && /bin/bash /backup/test.sh
Я протестировал команду в оболочке:
тест $ ((10 # $ (дата +% W)% 4)) -eq 1 && / bin / bash /backup/test.sh
и работает нормально, но я, если это не в cron, он его не выполняет.
Я благодарен за любую помощь.
Интересно, сработает ли это:
30 13 * * 6/4 /bin/bash /backup/test.sh
Я не уверен, будет ли он работать должным образом, но если мое понимание man 5 crontab
правильно, он будет запускаться каждую четвертую субботу (но, возможно, не в те дни, которые указаны в вашем коде).
Также обратите внимание, что вам нужно избегать знаков процента в crontabs, и они не могут использовать башизмы вроде базы 10 через 10#
(если вы не используете SHELL=/bin/bash
в верхней части вашего crontab или вашего /bin/sh
символическая ссылка на /bin/bash
).
Может, попробуйте вместо этого:
30 13 * * 6 test $((1$(date +%%W)%%4)) -eq 1 && /bin/bash /backup/test.sh
Это убирает башизм и заменяет его конкатенацией, которая в противном случае поглощает ведущие нули (107%4
== 7%4
== 3
так как 100 делится на 4). Он также избегает знаков процента, поэтому crontab не пытается их интерпретировать.
Ваш тест кажется командой для использования синтаксиса, который может быть "неверно истолкован" некоторыми оболочками, кроме bash
. Cron по умолчанию использует /bin/sh
оболочка.
Возможные исправления на выбор:
а) заворачивать test
аргумент в одинарных кавычках и принудительно "правая" оболочка
0 13 * * 6 /bin/bash -c 'test $((10#$(date +%W)%4)) -eq 0' && …
б) переместите вашу тестовую команду в отдельный исполняемый файл с явно выбранной оболочкой в shebang:
#!/bin/bash
exec test "$((10#$(date +%W)%4))" -eq 1
в) изменить оболочку, используемую cron
. В crontab добавить строку
SHELL=/bin/bash
В вашем конкретном случае вариант «а» кажется лучшим, но аналогичные проблемы могут быть лучше решены другими вариантами.