为什么我运行备份脚本时它能工作,但通过 cron 运行时却不起作用?

为什么我运行备份脚本时它能工作,但通过 cron 运行时却不起作用?

这是我的剧本,backup_mongo.sh

#!/bin/bash
suffix=$(date +%w)
rm /home/myuser/backup/mongo-$suffix -rf
mkdir /home/myuser/backup/mongo-$suffix
mongodump -h$1 -u$2 -p$3 -dmydb -o/home/myuser/backup/mongo-$suffix

在我的crontab -e

0   3  *   *   *    /bin/bash  /home/myuser/myproject/production/backup_mongo.sh  localhost user1 pass1

当我正常运行脚本(执行上述命令)时,脚本运行正常,并在 /mongo-$suffix 中创建目录“mydb”。

但是,当我将其放入 crontab 中时,会创建 /mongo-$suffix,但“mydb”目录不存在。/mongo-$suffix 中没有任何内容。

答案1

您可能没有mongodumpPATH请尝试使用命令的绝对路径mongodump

答案2

这很可能是 PATH 问题,但我建议不要在 crontab 中覆盖 PATH,因为它

  • 很容易避免这种行为
  • 可能存在安全风险

良好的 bash/sh 编码风格是将要触发的每个二进制文件的完整路径定义为变量

!#/bin/bash

RSYNC="/usr/bin/rsync"

并在稍后引用该变量。

$RSYNC /foo/bar baz

还有一些选项可以更改执行 crontab 的用户。假设有一个名为 mongodump 的用户定义了包含 mongodump 的 PATH,您可以成为该用户并编辑其 crontab。或者您也可以使用

/bin/bash /bin/su - mongodump -c /bin/bash /home/myuser/myproject/production/backup_mongo.sh

在 roots 的 crontab 中。

答案3

cron 的默认 PATH 受到限制。通常为/usr/bin:/bin。如果您想运行这些目录之外的任何内容,则有多种选择

使用命令的完整路径,例如/path/to/mongodump/mongodump ...

在 crontab 中定义扩展 PATH,例如

    PATH=/usr/bin:/bin/:/path/to/mongodump
    0 3 * * * /bin/bash  /home/myuser/myproject/production/backup_mongo.sh  localhost user1 pass1

在运行的脚本中定义 PATH

#!/bin/bash
PATH=/usr/bin:/bin:/paath/to/mongodump
suffix=$(date +%w)
rm /home/myuser/backup/mongo-$suffix -rf
mkdir /home/myuser/backup/mongo-$suffix
mongodump -h$1 -u$2 -p$3 -dmydb -o/home/myuser/backup/mongo-$suffix

相关内容