Я скопировал несколько заданий cron с сервера CentOS 7, на котором они выполнялись. cron.daily
на новый сервер Ubuntu 18.04. Задания обращаются к контейнерам докеров и выглядят так:
#!/bin/bash
/usr/bin/docker exec containername scriptname.sh
Сценарии являются исполняемыми и работают правильно при вызове root из оболочки:
/etc/cron.daily/script.sh # this works
Кроме того, когда я вызываю скрипты прямо из /etc/crontab
они работают:
35 0 * * * root /etc/cron.daily/script.sh # this works
Однако они должны вызываться частями выполнения:
45 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
Это молча терпит неудачу, когда скрипт находится в cron.hourly
и cron.daily
. Системный журнал содержит такие строки, как:
Jul 17 09:45:01 servername CRON[5436]: (root) CMD ( cd / && run-parts -v /etc/cron.hourly )
Другими словами называется run-parts. Другие скрипты в cron.hourly
и cron.daily
которые не вызывают докеры, похоже, работают. Я не могу найти сообщений об ошибках. На CentOS я бы предположил, что это проблема SELinux, но здесь я в тупике. Скрипты являются исполняемыми (иначе их нельзя было бы вызвать из crontab), клиент-докер не интерактивен и не использует терминал (нет -it
).
Что могло быть не так?
Обратите внимание, что у меня есть отличный обходной путь. Я могу просто позвонить по вакансиям из crontab, проблема решена. Я публикую, потому что хочу понять, почему это не работает, когда скрипты вызываются run-parts, чтобы я мог избежать подобной ошибки в будущем.
Попробуйте удалить .sh
расширение из вашего скрипта:
wally:[~] ls -l /tmp/foo
total 8
-rwxr-xr-x 1 mdz mdz 27 Aug 5 22:58 bar.sh
-rwxr-xr-x 1 mdz mdz 27 Aug 5 22:58 baz
wally:[~] cat /tmp/foo/bar.sh
#!/bin/bash
echo I am bar
wally:[~] cat /tmp/foo/baz
#!/bin/bash
echo I am baz
wally:[~] run-parts /tmp/foo
I am baz
wally:[~] mv /tmp/foo/bar.sh /tmp/foo/bar
wally:[~] run-parts /tmp/foo
I am bar
I am baz
wally:[~]