为什么我的备份脚本在运行时工作,而不是在通过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- $后缀中创build目录“mydb”。

但是,当我把它放在crontab中时,/ mongo- $后缀被创build,但是“mydb”目录不存在。 / mongo- $没有任何后缀。

您的PATH可能没有mongodump 。 尝试使用mongodump命令的绝对path。

这很可能是一个PATH问题,但是我build议不要在你的crontab中重写PATH,因为它是

  • 真的很容易避免这种行为
  • 可能是一个安全风险

它的bash / sh编码风格非常好,可以用全path作为variables来定义要触发的每个二进制文件

 !#/bin/bash RSYNC="/usr/bin/rsync" 

并在稍后参考该variables。

 $RSYNC /foo/bar baz 

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

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

在根的crontab中。

cron的默认path受限制。 通常是/usr/bin:/bin 。 如果你想在这些目录之外运行任何东西,你有几个select

使用命令的完整patheg /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