Cron: Почему мои скрипты cron не работают, хотя cron работает

У меня есть 4 сценария для передачи базы данных с одного сервера на другой для целей тестирования. Эти скрипты выполняются автоматически в ночное время. Когда я вызываю скрипты вручную, я не получаю ошибок, но без их запуска вручную, я не вижу никаких передаваемых данных.

Сервер 1:

ps -ef | grep cron root 2350 1 0 Apr23 ? 00:00:26 /usr/sbin/cron root 14293 9533 0 10:52 pts/4 00:00:00 grep cron 

Сервер 2:

 ps -ef | grep cron root 11269 8661 0 10:52 pts/1 00:00:00 grep cron root 21726 1 0 Jan30 ? 00:00:31 /usr/sbin/cron 

Сервер 1

 crontab -e # mh dom mon dow command 0 3 * * * /home/deploy/scripts/clearzip.sh 19 2 * * * /media/attachment/send_db.sh 

send_db.sh

 #! /bin/bash pg_dump -C "DB_NAME" | bzip2 | sshpass -v ssh user@server2 "bunzip2 | psql "DB_NAME"" pg_dump -C "DB2" | bzip2 | sshpass -v ssh user@server2 "bunzip2 | psql "DB2"" 

Server2:

 # mh dom mon dow command 12 2 * * * ./home/postgres/stop_services.sh 17 2 * * * ./home/postgres/dropdb.sh 55 5 * * * ./home/postgres/start_services.sh 

stop_services.sh:

 #! /bin/bash echo > >(tee -i /home/deploy/logfile.txt) sh /home/deploy/tomcat7/bin/catalina.sh stop killall java killall screen 

dropdb.sh

 su -c "psql -c 'drop database "DB1";'" -s /bin/sh postgres su -c "psql -c 'create database "DB1";'" -s /bin/sh postgres su -c "psql -c 'drop database "DB2";'" -s /bin/sh postgres su -c "psql -c 'create database "DB2";'" -s /bin/sh postgres 

Что я могу сделать неправильно? Есть идеи?

Обновить

Ошибки в файле журнала

 could not change directory to "/root": Permission denied could not change directory to "/root": Permission denied could not change directory to "/root": Permission denied could not change directory to "/root": Permission denied /home/postgres/start_services.sh: line 5: service: command not found /home/postgres/start_services.sh: line 6: service: command not found 

One Solution collect form web for “Cron: Почему мои скрипты cron не работают, хотя cron работает”

Я вижу две проблемы:

  1. Вы выполняете действия, требующие прав root, но выполняете их как обычный пользователь.

  2. Вы используете имена команд без их полного PATH, и поэтому сеанс, открытый cron, не знает, где их найти.

Чтобы исправить 1., не используйте crontab -e и вместо этого отредактируйте /etc/crontab или, что еще проще, запустите sudo crontab -e чтобы добавить его в crontab root. Затем отредактируйте свой dropdb.sh и удалите su (скрипт теперь будет запущен root, поэтому нет необходимости в su ).

Чтобы исправить 2, самым простым подходом было бы определение PATH в crontab. Он должен выглядеть так:

 PATH=/bin:/sbin:/usr/sbin:/usr/local/sbin:/usr/local/bin:/usr/bin # mh dom mon dow command 12 2 * * * ./home/postgres/stop_services.sh 17 2 * * * ./home/postgres/dropdb.sh 55 5 * * * ./home/postgres/start_services.sh 

Кроме того, отредактируйте свои скрипты и убедитесь, что все они используют абсолютные пути (так /usr/sbin/service вместо service ).

  • Как вы запускаете последовательность команд в командном инструменте?
  • Как найти текст, скопировать его и вставить в следующую строку в файле?
  • печать серии символов
  • Использование xargs с вводом из файла
  • Повторное использование пользовательского ввода в скрипте
  • Добавить строку суффикса в конец каждой строки?
  • экспорт PATH постоянно
  • используйте «mail» для чтения электронной почты из командной строки
  • Сценарий мониторинга для сервера redis
  • Проблемы безопасности
  • Сценарий, который удаляет лишние пробелы между буквами в тексте
  • Linux и Unix - лучшая ОС в мире.