【问题标题】:CRON bash execution result differs from manual launch [duplicate]CRON bash执行结果与手动启动不同[重复]
【发布时间】:2018-02-09 10:26:43
【问题描述】:

我使用GOGS 作为个人 Git 服务器(使用 Docker 映像)。我制作了一个备份脚本,当我手动启动它时它运行良好,但是当 CRON 启动它时,它似乎出现故障,因为备份与以前的完全相同。

重要的精度:像这样的常见问题与可能不完整的 $PATH 相关,但下面的脚本仅使用 dockerlsheadxargs 下的命令/usr/bin/usr(所以在 $PATH)。

3 周的示例结果(CRON 每周一次):

root@1:~# ll /path/to/backup/
total 1724864
-rw-r--r-- 1 root      root    588742750 janv. 29 11:30 gogs_2018_01_29.zip
-rw-r--r-- 1 root      root    588742750 janv. 29 11:30 gogs_2018_02_02.zip
-rw-r--r-- 1 root      root    588742750 janv. 29 11:30 gogs_2018_02_09.zip

甚至系统日期都是相同...虽然 bash 设置的日期与执行有很好的相关性。没看懂。

手动启动后:

-rw-r--r-- 1 root      root    588742750 janv. 29 11:30 gogs_2018_01_29.zip
-rw-r--r-- 1 root      root    588742750 janv. 29 11:30 gogs_2018_02_02.zip
-rw-r--r-- 1 root      root    589503781 févr.  9 11:21 gogs_2018_02_09.zip

上次备份更大,日期匹配...有效。

为什么我只在 CRON 启动时出现此故障?

脚本gogs_backup:

#!/bin/bash

# Make backup
docker exec -i -t gogs_1 /app/gogs/gogs backup --target /tmp --archive-name gogs.zip

# Build file name
now=$(date +"%Y_%m_%d")
file="/path/to/backup/gogs_$now.zip"

# Copy file
docker cp gogs_1:/tmp/gogs.zip $file

# Remove everything from /tmp dir
docker exec -i -t gogs_1 rm -rf /tmp/gogs*

# Keep only 3 in destination folder
ls -drt /path/to/backup/* | head -n-3 | xargs rm

CRON 行:

0       3       *       *       5       bash /path/to/gogs_backup

【问题讨论】:

  • 有趣的链接,但 AFAIS :不是$PATH 问题(即使没有设置PATH,我检查了给出的提示,/usr/usr/bin 在这里完成工作,我得到了回车我的 crontab 文件的结尾,已经让 shebang 强制使用 bash... 到目前为止,这只是我能看到的适用于我的问题的相关提示
  • 你有日志文件来读取 crons 消息吗?它告诉你什么?如果其中一个命令失败,您能否在脚本中添加错误消息以查看失败的位置?你能添加一些东西来证明脚本已经运行(更新时间戳文件)吗?

标签: linux bash git cron


【解决方案1】:

来自执行文档

The docker exec command runs a new command in a running container.

并且来自 cp 文档

The CONTAINER can be a running or stopped container.

所以我的猜测是 docker exec 失败是因为容器已停止,但 cp 有效,因为它适用于已停止的容器。

检查您的日志。并检查您的返回值,此脚本中还有更多错误。

【讨论】:

  • 好主意,但在我的情况下不是。容器在脚本运行时处于活动状态并正在运行
  • 也许 -i 让它失败了?如果和我写的效果一样,但原因不同。
【解决方案2】:

感谢@mncl 的帖子,我决定再次查看 docker 命令文档。 我在这里发现我跑了docker exec -i -t gogs_1 /app/gogs/gogs backup --target /tmp --archive-name gogs.zip

-i 对我来说似乎没用,因为它是 CRON 启动。我删除了它,CRON 启动的脚本运行良好。

尽管如此,the Docker doc 关于-i 让我很困惑。为什么在这种情况下保持 STDIN 附加到命令会是一个问题?

【讨论】:

    猜你喜欢
    • 2020-12-26
    • 2015-09-23
    • 2015-12-19
    • 1970-01-01
    • 2021-01-01
    • 2019-07-14
    • 2013-09-25
    • 1970-01-01
    • 2013-08-28
    相关资源
    最近更新 更多