【问题标题】:how to set path for cron backup zip file如何设置 cron 备份 zip 文件的路径
【发布时间】:2017-03-13 06:39:02
【问题描述】:

我有一个 shell 脚本(存储在 /home/username/public_html/backup_dir/db_backup.sh 中)用于进行数据库备份。

当我通过 putty 在我的 共享主机 中运行 shell 脚本时,转到目录 /home/username/public_html/backup_dir/,然后通过命令 sh db_backup.sh 运行脚本,它会在 @ 中创建 zip 文件987654324@目录(好);但是当我通过 crontab 运行时,相同的脚本会在根目录(即/(问题) 中创建 zip 文件。

我希望 cron 在 shell 脚本所在的 /home/username/public_html/backup_dir/ 中创建 zip 文件。

我知道我必须在某个地方设置存储路径,但我不知道在哪里写。

Shell 脚本 (db_backup.sh)

#!/bin/sh
FILE=my_db.sql.`date +"%Y%m%d"`
DATABASE=db_name
USER=db_username
PASS=db_password
unalias rm     2> /dev/null
rm ${FILE}     2> /dev/null
rm ${FILE}.gz  2> /dev/null
mysqldump --opt --user=${USER} --password=${PASS} ${DATABASE} > ${FILE}
gzip $FILE
echo "${FILE}.gz was created:"

crontab 命令

0 */6 * * *  sh  /home/username/public_html/backup_dir/db_backup.sh

任何帮助/建议都会帮助分配。

谢谢。

【问题讨论】:

  • 非交互式脚本通常没有别名扩展,因此unalias 基本上是空操作。
  • 另外,rm 采用任意数量的文件名,因此您可以使用rm -f "$FILE" "$FILE.gz"-f 基本上会关闭“找不到文件”警告作为副作用,因此您不需要错误重定向。
  • @tripleee:其实我不知道shell脚本,我在google中找到的提到的代码所以使用它。那么我应该用rm -f "$FILE" "$FILE.gz" 替换3 行(以unalias 开头)吗?我也必须写2> /dev/null吗?
  • 是的,就是这样;不,你不需要2> /dev/null,这就是“你不需要错误重定向”的意思。
  • 谢谢@tripleee,那我就换了。

标签: sh crontab


【解决方案1】:

Cron 运行调用用户主目录中的每个作业。显然,您是在 root 的 crontab 之外运行的。

正确的解决方法可能是将目录路径添加到脚本中:

FILE=/home/username/public_html/backup_dir/my_db.sql.$(date +%Y%m%d)

或者如果你明确想要使用运行脚本的路径名

FILE=$(dirname "$0")/my_db.sql.$(date +%Y%m%d)

不太理想的是,您的脚本可以在执行任何实际工作之前显式地cd 到此目录,但我建议您不要这样做,因为

  • 脚本最终可能会失败 cd 但仍会继续(当然,您可以添加 set -e 以使每次失败都致命,但这也可能需要在其他地方进行一些代码更改)。
  • 如果要始终在同一位置创建文件,即使是未经训练的人也应该明白这一点。

【讨论】:

  • 嗨,@tripleee 您的回答有效,但我没有接受您的回答,因为缺少文件名后缀。顺便说一句,感谢您提供如此详细的答案。
【解决方案2】:

你可以试试这个吗?

#!/bin/sh
FILE=/home/username/public_html/backup_dir/my_db.sql.$(date +"%Y%m%d")
DATABASE=db_name
USER=db_username
PASS=db_password
unalias rm     2> /dev/null
rm ${FILE}     2> /dev/null
rm ${FILE}.gz  2> /dev/null
mysqldump --opt --user=${USER} --password=${PASS} ${DATABASE} > ${FILE}
gzip $FILE
echo "${FILE}.gz was created:"

【讨论】:

  • 感谢@Mustafa DOGRU,它可以工作,但生成的文件不同,gzip 也不能工作,即生成的 sql 文件没有压缩。新生成的文件名是 my_db_file.sql.Mon Oct 31 16:58:01 GMT 2016 而我想要的是 my_db_file.sql.20161031.gz
  • 如您所说,在更改文件名后我注意到另一个问题,每次 cron 运行时都会创建一个新文件,然后用相同的日期替换现有文件。
  • @RaunakGupta;您是否在脚本中使用日期“%Y%m%d”,您的文件输出是时间戳。但是这个脚本只生成像 20161031 这样的日期。什么是结果日期 +"%Y%m%d" 终端输出。我更新了答案。也许这可以帮助你。如果你解决了这个问题,gzip 命令也能正常工作。
猜你喜欢
  • 1970-01-01
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
  • 2014-08-29
  • 2011-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多