我在 中有以下文件/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
发出命令时,而不是仅使用。我现在已相应地更改了命令。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
答案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.