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

今天想给服务器加个自动备份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)

所以要修改默认设置,或者简单点,在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

.... 脚本正文

时间: 2024-10-28 22:44:59

crontab的两大坑:百分号和环境变量的相关文章

crontab中运行newLISP脚本的环境变量设置

今天遇到一个问题,在终端里运行newLISP脚本,一切正常,移动到crontab中就不行.即便crontab -e命令运行在同一个用户下,还是有问题. 由于newLISP脚本要用到hive和hadoop,估计是环境变量的问题.所以先用newLISP shell运行(env)命令,将当前环境变量记录到文件evn.lsp中. 然后在newLISP脚本中加载之. 下面是env.lsp文件部分内容: (set 'local-envs '(("LC_PAPER" "en_US.UTF-

bash 环境变量

bash环境配置: 配置文件: 生效范围划分,存在两类:   全局配置: /etc/profile,/etc/profile.d/*.sh /etc/bashrc   个人配置: ~/.bash_profile ~/.bashrc 按功能划分,存在两类: profile类: 为交互式登录的shell提供配置 /etc/profile,/etc/profile.d/*.sh ~/.bash_profile 功用: 1 定义环境变量,例如PATH,PS1 2 运行命令或脚本 bashrc类: 为非交

nodejs安装过程中环境变量配置的问题

基本知识: 命令行工具是运行在当前计算机用户下的,所以开头总是C:\Users\XXX>,而不会跟你的nodejs安装的位置有关. 安装node后,在cmd里有两种模式,开发模式和命令行模式,要进入开发模式直接输入node回车即可,此时可以输入代码,比如require ("express"),如果直接在命令行模式下输入require类的语句是会报错的,提示'require'不是内部或外部命令,也不是可运行的程序或批处理文件.从开发模式退出可用.exit命令也可以用快捷捷,ctrl

Bash 是如何从环境变量中导入函数的

在上文中曾说到: 所谓的环境变量的真实面目其实就是个任意字符串 Bash 在启动时会将 environ 数组中包含 = 号的字符串导入成为自己的变量 Bash 在启动外部命令时会将自己内部标记为环境变量的变量重组成字符串数组赋值给 environ 本文中继续深入讲三点: environ 数组中可能存在 = 左边名字相同的元素,也就是同名的环境变量,Bash 是怎么导入的? Bash 还可以从环境变量中导入函数,甚至同时导入两个同名的变量和函数 Bash 还可以同时导出两个同名的变量和函数 如果有

辛星浅谈Linux中的环境变量

全局变量和本地环境变量: bash  shell使用一种称为环境变量的特性来存储关于shell会话和工作环境的信息,这也是环境变量的名字的由来.该特性还允许我们把数据存储在内存中,以便于在shell中运行的程序或者脚本中访问它们.bash  shell中共有两种类型的环境变量:全局变量和本地变量. 全局环境变量在shell会话和该shell产生的任何子进程中都可见.而本地变量则只在创建它们的shell中可见.在产生需要父进程信息的子进程的应用程序中,这便体现了全局变量的重要作用.系统环境变量使用

GStreamer 1.0 运行时环境变量设置

插件搜索路径 GStreamer程序运行时,按照以下顺序搜索插件: PATH GST_PLUGIN_PATH_1_0 或 GST_PLUGIN_PATH GST_PLUGIN_SYSTEM_PATH_1_0 或 GST_PLUGIN_SYSTEM_PATH 每个环境变量包含一个路径列表. GST_PLUGIN_PATH_1_0环境变量如果被设置,则GST_PLUGIN_PATH自动失效. 这为系统同时安装GStreamer-0.10和GStreamer-1.0提供了便利. 同样的, GST_PL

【一点一滴,成材之基!】bash的环境变量配置文件

目录:(一)bash配置文件分类(二)bash配置文件的读取(三)配置文件实战 (一)bash配置文件分类(1.1)bash的配置文件主要有两类,第一种是全局配置文件,第二种是个人配置文件.其中全局配置文件主要包含三类:/etc/profile./etc/profile.d/*.sh./etc/bashrc这三种,而个人配置文件主要包括两类:~/.bash_profile.~/.bashrc这两种.(1.2)从类别的角度来分类主要可以分为profile类的文件和bashrc类的文件.(1.2.1

Linux的PS1.PS2.PS3.PS4等环境变量;Crontab的两个坑人点;变量传递等

1.问题出现: 我为了实现一个功能,就是让PS1变量(命令行提示符)每隔1分钟(利用crontab计划任务)变化一次颜色和背景格式以实现酷炫的效果,但是经过了各种尝试均以失败告终.虽然能够实现让PS1每按一次回车变化一次颜色(这个有人想尝试的话下面写的有),但是无法做到让它每隔一段时间进行一次格式的变化为了解决这个问题,进行了一些研究,总结了一下写在下面 附加:PS1每按一次回车实现颜色变化实现: 先在脚本中写入: #!/bin/bash PS1="\033[01;\$[RANDOM%7+31]

crontab 环境变量问题

crontab执行脚本的时候,有可能会因为环境变量的问题而不能执行.如手动执行sh /root/aa.sh时,是成功的,在另一台虚拟机也是成功的.但在某一台就没成功.此时,可以添加PATH到aa.sh里. vi /root/aa.sh #!/bin/bash PATH="/usr/local/jdk1.7.0_79//bin:/usr/local/jdk1.7.0_79/bin:JRE_HOME/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr