Скрипт Bash не выполняется из crontab

У меня есть следующий сценарий bash:

#!/bin/bashmysqldump -u ******** -p********  --all-databases | gzip > /home/srvlinux01/MySQLBackups/database_$(date +\%Y-\%m-\%d).sql.gz

который находится в /home/srvlinux01/MySQLBackups/ как backup.sh со следующими разрешениями

-rwxr--r-- 1 root       root           134 feb 27 12:48 backup.sh

Я устроил дружескую работу на sudo crontab -e запускать его каждый день, ночью

#Automatic MySQL backup30 3 * * * sh /home/srvlinux01/MySQLBackups/backup.sh

Но я получаю по электронной почте следующую ошибку:

sh: 0: Can't open /home/srvlinux01/MySQLBackups/backup.sh

Я пробовал разные настройки, но не могу понять, что не так. Я могу запустить скрипт вручную, и все идет отлично, так что я предполагаю, что с моей записью cronjob что-то не так, но не могу понять, что именно. Не могли бы вы, пожалуйста, помочь мне разобраться в этом? Спасибо!

Вам нужно дать вашему cron PATH. Например:

SHELL=/bin/sh PATH=/bin:/sbin:/usr/bin:/usr/sbin 

В вашем случае попробуйте поместить это до ваша команда. Проверьте вики-страницу сообщества в этот вопрос для получения дополнительной информации о том, почему PATH переменная необходима. Вот выдержка; по сути, идея заключается в том, что cron не читает /etc/environment:

Распространенная "ошибка" заключается в том, что переменная окружения PATH отличается. Возможно, ваш cron-скрипт использует команду somecommand найденный в /opt/someApp/bin, который вы добавили в PATH в /etc/environment? cron не считывает этот файл, поэтому запуск somecommand из вашего скрипта произойдет сбой при запуске с помощью cron, но он будет работать при запуске в терминале. Чтобы обойти это, просто установите свой собственный PATH переменная в верхней части скрипта.

chmod +x /home/srvlinux01/MySQLBackups/backup.sh             

попробуйте запустить свой скрипт с полным путем в командной строке:

/home/srvlinux01/MySQLBackups/backup.sh

если он не запущен - что-то не так (ошибка пути)

Убедитесь, что это ваш crontab

crontab -e 

нет sudo :

sudo crontab -e

является корневым crontab - и root не может найти ваш скрипт ;)

удалите "sh" в crontab, просто напишите:

30 3 * * * /home/srvlinux01/MySQLBackups/backup.sh

Я вижу одну ошибку в вашей конфигурации файла crontab. В приведенной ниже конфигурации вы пытаетесь вызвать backup.sh так же, как и в вашей командной строке с sh префикс, который может не работать в cron.

#Automatic MySQL backup30 3 * * * sh /home/srvlinux01/MySQLBackups/backup.sh
Решение:
  1. при необходимости измените владельца, как указано в комментарии.
  2. Сделайте его исполняемым.
    chmod a+x <имя файла>
  3. Обновите свой crontab, чтобы отразить это. (вызывая файл напрямую, оболочка используется в соответствии со строкой shebang внутри файла)

    #Automatic MySQL backup30 3 * * * /home/srvlinux01/MySQLBackups/backup.sh

Я надеюсь, что это поможет.

Вы забыли точку "." перед путем выполнения.

30 3 * * * sh ./home/srvlinux01/MySQLBackups/backup.sh                           ^

Можете ли вы попробовать это с помощью sudo: sudo sh /home/srvlinux01/MySQLBackups/backup.sh

Вы пытались сменить владельца? Если вы запустите этот скрипт как обычный пользователь, chown user:user /home/srvlinux01/MySQLBackups/backup.sh (замените user:user на ваше имя пользователя и название вашей группы пользователей). При этом вы можете нормально запускать скрипт как обычный пользователь. Кроме того, если владелец root, сделайте то, что видел @Guru, запустите скрипт с помощью sudo.

Итак, теперь я сменил владельца скрипта на srvlinux01 (основной пользователь) и переместил cronjob в ** crontab -e ** вместо sudo crontab -e.

Однако по-прежнему безуспешно, как ни странно, он по-прежнему не может найти файл. Если я просто скопирую команду и вставлю ее в терминал, она будет работать нормально и создаст резервную копию!

Может быть, вам нужно указать своему cron ПУТЬ? Например: SHELL=/bin/sh PATH=/bin:/sbin:/usr/bin:/usr/sbin В вашем случае попробуйте поместить: SHELL=/bin/sh PATH=/bin:/sbin:/usr/bin:/usr/sbin:/home/srvlinux01/MySQLBackups/ перед вашим команда.

Или не могли бы вы попробовать изменить shebang на #!/bin/sh?

Почему ваша “резервная копия” не работает.у вас есть права на выполнение? Учитывая, что он доступен для чтения во всем мире, удаление разрешений x для группы и других бессмысленно, поскольку world может просто сделать резервную копию cat.sh | sh` и добиться того же. Помимо, очевидно, возможности просто прочитать имя пользователя и пароль…

Я обнаружил, что на сервере включено домашнее шифрование (вздох!), Поэтому я попытался переместить скрипт в отдельный каталог, но он по-прежнему не работает. Так что, похоже, проблема не в этом. Я пытался сменить шебанг, но все равно безуспешно.

вы пробовали использовать “ПУТЬ”?

Блестяще! Трюк с ТРОПИНКОЙ сделал свое дело! Не могли бы вы просто объяснить, что он делает, чтобы я мог использовать его в будущем? Может быть, сообщение - это ответ, чтобы я мог пометить его как правильный! :wink:

И спасибо zwets, изменил разрешения, должно быть, что-то напутал, пытаясь заставить его работать.