我有一个 sh 脚本。如何使用 crontab 运行它?

我有一个 sh 脚本。如何使用 crontab 运行它?

我有以下文件execute-backup-from-container.sh。该文件的内容是:

#!/bin/bash
FILE=minime.sql.`date +"%Y%m%d".gz`
CONTAINER='mysql_01'
SCRIPT_ON_CONTAINER='/container-mysql-dump.sh'

${OUTPUT}=$(docker exec ${CONTAINER} /$SCRIPT_ON_CONTAINER)

echo "=============="
echo "$CONTAINER:/$FILE"
echo "=============="
docker cp "$CONTAINER:/$FILE" backup-data/

当我运行时,crontab -e我输入以下内容:
0 5 * * 1 /home/me/projects/execute-backup-from-container.sh 这意味着应该execute-backup-from-container.sh每天凌晨 5:00 执行。
问题是脚本根本没有执行。
那么到底是什么问题呢?为什么不执行呢?

答案1

与您的条目相对应的 cron 字段的含义是:

minute:       0 
hour:         5 
day of month: * 
month:        * 
day of week:  1 
command:      /home/me/projects/execute-backup-from-container.sh

其英文翻译为:星期一早上 5 点(每月的任何一天,任何月份)。

如果你想让它被执行:

每天凌晨 5:00

那么您希望第五个字段是*

0 5 * * * /home/me/projects/execute-backup-from-container.sh

答案2

您是否检查该文件是否设置为可执行?以下是将脚本标记为可执行的示例:

$ ls -l test.sh
-rw-r--r-- 1 ahill ahill 0 Mar 23 19:30 test.sh
$ chmod +x test.sh
$ ls -l test.sh
-rwxr-xr-x 1 ahill ahill 0 Mar 23 19:30 test.sh

接下来要检查的是环境。默认情况下,cron 作业不继承任何环境。这里讨论“修复”:
如何使用现有环境变量运行 cron 命令?

环境很重要的原因之一是 cron 甚至可能找不到 bash!看: https://www.digitalocean.com/community/questions/why-is-cron-not-running-my-sh-script

如果您仍然无法弄清楚,我会做一个测试:将您的 cron 作业更改为:

0 5 * * * /home/me/projects/execute-backup-from-container.sh

到:

0 5 * * * /home/me/projects/execute-backup-from-container.sh >> ~/script_errors.log 2>&1 

将会发生什么:下次 cron 启动作业时,产生的错误消息将转储到文本文件 script_errors.log 中。 (将 script_errors.log 文件的路径更改为任何看起来合适的路径,但确保该路径存在,尽管该文件不需要。)

我还注意到OP中的一些内容可能是真正的问题:“容器”这个词。如果脚本位于 Docker 容器内,那么这可能是解决方案:
https://www.ekito.fr/people/run-a-cron-job-with-docker/

答案3

考虑到所有答案后,最后一个问题在最后一行:

docker cp "$CONTAINER:/$FILE" backup-data/  

最后一行应该是

docker cp "$CONTAINER:/$FILE" docker-projects/mysql/backup-data/  

感谢大家的支持。

相关内容