cron.hourly 中的脚本不运行

cron.hourly 中的脚本不运行

我在 中有以下文件/etc/cron.hourly。此脚本的目的是每小时创建一个 docker-MongoDB 转储备份,然后使用 rclone 将此转储文件与 Google Drive 文件夹中的内容同步。

脚本名称:

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

我将 .hourly 的 crontab 更改为最近的时间,这样就不必等到 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

感谢大家!

答案1

好的,看来这是 的问题。当通过Docker发出命令时,而不是仅使用。我现在已相应地更改了命令。Dockercron-it-iDocker

更改的脚本:

#!/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

答案2

脚本的第四行看起来很可疑,已得到以下证实外壳检查

% 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.

相关内容