有朋友说,他写了一个脚本来做计划任务定时备份数据库,但却一直都备份不成功,手动执行脚本也没有问题,而且在/var/log/cron日志里看到成功执行了,但就是没看到备份的数据库文件.
拿了ssh权限,登录之后,看了之后,和他所说的情况一样,脚本执行成功,但没有生成备份,不过,查了一下发给root的邮件,看到了问题:
- Return-Path:<root@test.com>
- X-Original-To:root
- Delivered-To:root@test.com
- From:root@test.com(CronDaemon)
- To:root@test.com
- Subject:Cron<root@test>sh/data/cron/backup.sh
- Content-Type:text/plain;charset=UTF-8
- Auto-Submitted:auto-generated
- X-Cron-Env:<LANG=en_US.UTF-8>
- X-Cron-Env:<SHELL=/bin/sh>
- X-Cron-Env:<HOME=/root>
- X-Cron-Env:<PATH=/usr/bin:/bin>
- X-Cron-Env:<LOGNAME=root>
- X-Cron-Env:<USER=root>
- Date:Tue,1Apr201410:58:01-0400(EDT)
- Status:R--phpfensi.com
- /data/cron/backup.sh:line27:mysql:commandnotfound
从上面可以看到,说mysql命令没有找到,于是执行了一下命令:
- [root@testdata]#echo$PATH
- /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/nginx/sbin:/usr/local/mysql/bin
这样就知道了问题所在,在crontab里的执行环境变量与root用户设置的环境变量不一致,从上面两个可以看出区别:
crontab里的环境变量:X-Cron-Env:<PATH=/usr/bin:/bin>
root用户的环境变量:
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/nginx/sbin:/usr/local/mysql/bin
现在我们已经知道了,mysql这个命令是放在/usr/local/mysql/bin下面,而crontab的PATH变量中却没有这一条,所以出现mysql:command not found的问题.
同时,我们可以新建一个脚本,在crontab里验证一下PATH变量:
- [root@testdata]#vipath.sh
- #!/bin/bash
- echo$PATH
- #保存后,加入到crontab
- [root@testdata]#crontab-e
- */1****/data/path.sh
1分钟后,可以看到:/usr/bin:/bin,知道了问题,那就好解决了,有两种.
1.在备份脚本里,手动设置一下,例如:
- #!/bin/bash
- ./etc/profile
- ....余下内容...
这里需要“. /etc/profile”,是因为朋友的mysql是自己编译的,把mysql的路径都添加到这里:
PATH=$PATH:$HOME/bin:/usr/local/nginx/sbin:/usr/local/mysql/bin
export PATH
2.直接设置用户的crontab,添加路径/usr/local/mysql/bin,例如:
- [root@testdata]#crontab-e
- SHELL=/bin/bash
- PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/nginx/sbin:/usr/local/mysql/bin:/root/bin
- MAILTO=root
- HOME=/
- --phpfensi.com
- 0*/12***sh/data/cron/backup.sh
保存之后,就可以正常备份了,另外可以了解一个文件/etc/crontab:
- [root@testdata]#cat/etc/crontab
- SHELL=/bin/bash
- PATH=/sbin:/bin:/usr/sbin:/usr/bin
- MAILTO=root
- HOME=/
- #Fordetailsseeman4crontabs
- #Exampleofjobdefinition:
- #.----------------minute(0-59)
- #|.-------------hour(0-23)
- #||.----------dayofmonth(1-31)
- #|||.-------month(1-12)ORjan,feb,mar,apr...
- #||||.----dayofweek(0-6)(Sunday=0or7)ORsun,mon,tue,wed,thu,fri,sat
- #|||||
- #*****user-namecommandtobeexecuted