crontab的两大坑:百分号和环境变量

今天想给服务器加个自动备份mysql数据库的功能(别怪我这么久才加,阿里云天天全盘备份的,不怕丢数据库),本觉得只要5分钟就能搞定的,结果入了两个大坑。mysql

个人crontab是这样写的:sql

 * * * mysqldump -u user -pxxxx database > "/alidata/backup/imyzf.com/$(date +%F\ %T).sql"

首先,是百分号(%)。数据库

在crontab -e中输入的命令里,第一个%会被认为是标准输入的开始,接下来的%都会被认为是换行。因此在这里本来只是格式化日期的%被当成了标准输入,命令就出问题了。bash


解决%方案有:服务器

1 前面加 \ 转义符  \%ide

2 加单引号   'date %F'测试

3 把命令写到脚本里阿里云

我采用了把命令写到了sh文件里(为何?由于还有一个大坑)。spa

而后,是环境变量。code

即便解决了上面的问题,仍是不能正常执行任务,由于crontab的环境变量是另外定义的。经过cat /etc/crontab你会发现默认的PATH是/sbin:/bin:/usr/sbin:/usr/bin,而咱们的mysqldump是在/alidata/server/mysql/bin里的。

注:/etc/crontab文件定义的系统cron环境变量,咱们本身定义的称做用户cron,我测试了一下/bin,/usr/bin下的命令能够直接运行,而/sbin,/usr/sbin下的命令不能够运行(只测试了2个:ifconfig fdisk)

contab系统设置

因此要修改默认设置,或者简单点,在sh文件里另外加上一行修改PATH,最后成了这样:

#!/bin/bashPATH="$PATH:/alidata/server/mysql/bin"mysqldump -u user -pxxxx database > "/alidata/backup/www.imyzf.com/$(date +%F\ %T).sql"

而后,个人crontab写成了这样(使用/dev/null是为了丢弃mysqldump使用标准输出的提示):

 * * * /alidata/backup/www.imyzf.com/backup.sh > /dev/null 2>&1

好了,终于搞定了!

注:其实添加环境变量有更简单的办法,只要加上source /etc/profile便可(如bashrc .bash_profile等有特殊环境变量,多加几个source便可)

#!/bin/bash

source /etc/profile

.... 脚本正文

相关文章
相关标签/搜索