У меня есть следующий файл в / etc / cron. ежечасно
. Целью этого сценария является создание резервной копии дампа docker-MongoDB каждый час, а затем использование rclone для синхронизации этого файла дампа с содержимым в папке Google Диска.
Имя скрипта:
rclone_Linux_MongoDB_Sync
Скрипт:
#!/bin/sh
/usr/bin/docker exec -it mongodb mkdir /data/dump
/usr/bin/docker exec -it mongodb mongodump --db myDB -u theUser -p thePassword --gzip --out /data/dump/
# RClone Config file
RCLONE_CONFIG=/home/ubuntu/.config/rclone/rclone.conf
export RCLONE_CONFIG
#if [[ "`pidof -x $(basename $0) -o %PPID`" ]]; then exit; fi
/usr/bin/rclone sync /data/dump/myDB/MongoDB_Backup:MongoDB_Current
Я сделал:
sudo chmod +x /etc/cron.hourly/rclone_Linux_MongoDB_Sync
sudo chmod 777 /etc/cron.hourly/rclone_Linux_MongoDB_Sync
Обратите внимание, что у меня нет расширения .sh
для скрипта. Раньше это было моей проблемой. Теперь, когда я запускаю следующее, мой скрипт отображается.
run-parts --test /etc/cron.hourly
Мой сценарий также работает правильно, когда я это делаю:
./rclone_Linux_MongoDB_Sync
Он также запускается, когда я выполняю:
run-parts /etc/cron.hourly
Я проверил / etc / crontab с помощью:
cat /etc/crontab
Часть результата следующая. Насколько я понимаю, это правильно.
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#
Я оценил журналы для cron следующим образом:
grep CRON /var/log/syslog
Для ежедневного, еженедельного и ежемесячного, я полагаю, они раньше не работали из-за того, что не был установлен anacron. Я установил anacron с помощью:
sudo apt-get install anacron
cron.hourly работает с 17-минутной отметкой часа, как указано в / etc / crontab
. В соответствии с этим я вижу следующее, повторяющееся каждый раз с отметкой времени 17.
Jul 19 17:17:01 vps-fac5a33c CRON[1039453]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
Jul 19 17:17:09 vps-fac5a33c CRON[1039452]: (root) MAIL (mailed 104 bytes of output but got status 0x004b from MTA#012)
Jul 19 18:17:01 vps-fac5a33c CRON[1045250]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
Jul 19 18:17:18 vps-fac5a33c CRON[1045249]: (root) MAIL (mailed 104 bytes of output but got status 0x004b from MTA#012)
Jul 19 19:17:01 vps-fac5a33c CRON[1051174]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
Jul 19 19:17:21 vps-fac5a33c CRON[1051173]: (root) MAIL (mailed 104 bytes of output but got status 0x004b from MTA#012)
Возможно, есть некоторые вещи, которые я сделал, о которых я забыл и не перечисленных здесь. Тем не менее, я не понимаю, почему это не работает. Я оценил много разных сообщений на форуме, попробовал их процесс, но у меня это не работает.
Почему мой сценарий не запускается каждый час, если он помещен в /etc/cron.hourly
?
Он не запускается сам по себе. Он должен запускаться каждый час.
В качестве дополнительного примечания, в моем сценарии ранее было:
#!/bin/bash
Однако, основываясь на некоторых сообщениях, я изменил его на:
#!/bin/sh
Когда я запускаю shellcheck
в моем сценарии, ничего не отображается, что означает что это нормально согласно shellcheck
и синтаксически корректно:
shellcheck rclone_Linux_MongoDB_Sync
В начало скрипта после #! / bin / sh
добавлено следующее. Это нужно для того, чтобы увидеть, какие ошибки возникают в скрипте во время выполнения.
exec 1>>/tmp/rclone_Linux_MongoDB_Sync.log 2>&1
Я изменил crontab с .hourly на последнее время, чтобы не ждать 17-минутной отметки для его запуска.Из-за вышеупомянутого добавления к моему файлу сценария был создан следующий файл:
/tmp/rclone_Linux_MongoDB_Sync.log
После запуска:
cat /tmp/rclone_Linux_MongoDB_Sync.log
Отображалось следующее.
the input device is not a TTY
the input device is not a TTY
Спасибо всем!
Итак, похоже, это проблема с Docker
. При выдаче команд в Docker
через cron
вместо -it
используется только -i
. Теперь я изменил свои команды Docker
соответствующим образом.
Измененный сценарий:
#!/bin/sh
exec 1>>/tmp/rclone_Linux_MongoDB_Sync.log 2>&1
/usr/bin/docker exec -i mongodb mkdir /data/dump
/usr/bin/docker exec -i mongodb mongodump --db myDB -u theUser -p thePassword --gzip --out /data/dump/
# RClone Config file
RCLONE_CONFIG=/home/ubuntu/.config/rclone/rclone.conf
export RCLONE_CONFIG
#if [[ "`pidof -x $(basename $0) -o %PPID`" ]]; then exit; fi
/usr/bin/rclone sync /data/dump/myDB/MongoDB_Backup:MongoDB_Current
Теперь сценарий может работать, как и предполагалось, и запускается автоматически каждый час. Исправление заключалось в замене -it
в командах Docker
на просто -i
.
Четвертая строка вашего скрипта выглядит подозрительно, что подтверждается shellcheck:
% shellcheck rclone_Linux_MongoDB_Sync
In rclone_Linux_MongoDB_Sync line 4:
/usr/bin/docker exec -it mongodb mongodump --db dashboarddb -u hifi_dbpc_host ->
^-- SC1009: The mentioned syntax error was in this simple command.
^-- SC1073: Couldn't parse this redirection. Fix to allow more checks.
^-- SC1072: Fix any mentioned problems and try again.