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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

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

我的crontab是这样写的:

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

首先,是百分号(%)。

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


解决%方案有:

1 前面加 \ 转义符  \%

2 加单引号   'date %F'

3 把命令写到脚本里

我采用了把命令写到了sh文件里(为什么?因为还有一个大坑)。

然后,是环境变量。

即使解决了上面的问题,还是不能正常执行任务,因为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

.... 脚本正文











本文转自younger00851CTO博客,原文链接: http://blog.51cto.com/younger008/1980548,如需转载请自行联系原作者



相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
Shell
Shell编程自动化之特殊变量、特殊状态变量和Shell子串
本文主要介绍了Shell编程自动化之特殊变量、特殊状态变量和Shell子串,并结合实例测试。
57 0
|
编译器 Shell Linux
Linux:shell编程2(内含:1.设置环境变量+2.位置参数变量+3.预定义变量+运算符+4.条件判断)
Linux:shell编程2(内含:1.设置环境变量+2.位置参数变量+3.预定义变量+运算符+4.条件判断)
156 0
Linux:shell编程2(内含:1.设置环境变量+2.位置参数变量+3.预定义变量+运算符+4.条件判断)
|
Shell
SHELL脚本递归循环,文件名包含空格的处理办法
SHELL脚本递归循环,文件名包含空格的处理办法
182 0
|
缓存 Shell 开发工具
Shell脚本编程实践——第4关:编写一个脚本,计算txt文件中每一行单词的个数并将结果写入另一个文件
Shell脚本编程实践——第4关:编写一个脚本,计算txt文件中每一行单词的个数并将结果写入另一个文件
975 0
|
机器学习/深度学习 IDE Shell
shell脚本编程-查找命令
shell脚本编程-查找命令
200 0
|
Shell
学习shell脚本编程-变量的替换
学习shell脚本编程-变量的替换
121 0
|
SQL Shell 数据库
如何让脚本在任意地方可执行
如何让脚本在任意地方可执行
151 0
如何让脚本在任意地方可执行
|
Ubuntu Linux Shell
如何让你的脚本可以在任意地方都可执行?
如何让你的脚本可以在任意地方都可执行?
473 0
如何让你的脚本可以在任意地方都可执行?
|
JSON Java Unix
《懒人Shell脚本》之十——统计多重路径下的不同扩展名文件及个数
1、统计实现 find -type f | sed -e 's/.*\.//' | sort | uniq -c | sort -n > rst.txt 1 2、脚本分解 1) find -type f regular file , 查找正规的文件 返回:./bak_network/道x网站/bak_第8章.md
144 0
|
SQL 安全 Shell
通过切割环境变量绕过限制,实现命令执行
命令执行漏洞,指的是可以执行系统命令或者应用指令(如cmd或者bash命令)的漏洞 简单说就是用户输入的数据被当作系统命令来执行,php的命令执行漏洞主要基于一些函数的参数过滤不全而导致
222 0