这是我的剧本,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
您可能没有mongodump
。PATH
请尝试使用命令的绝对路径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