Скрипт в cron.hourly не запускается

У меня есть следующий файл в / 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

Спасибо всем!

2
задан 20 July 2021 в 22:09

2 ответа

Итак, похоже, это проблема с 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.

1
ответ дан 28 July 2021 в 11:16

Четвертая строка вашего скрипта выглядит подозрительно, что подтверждается 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.
0
ответ дан 28 July 2021 в 11:16

Другие вопросы по тегам:

Похожие вопросы: