当前位置:首页 > linux教程 > 列表

linux下env环境变量引起的crontab不生效解决办法

发布:smiling 来源: PHP粉丝网  添加日期:2015-04-21 11:09:23 浏览: 评论:0 

有朋友说,他写了一个脚本来做计划任务定时备份数据库,但却一直都备份不成功,手动执行脚本也没有问题,而且在/var/log/cron日志里看到成功执行了,但就是没看到备份的数据库文件.

拿了ssh权限,登录之后,看了之后,和他所说的情况一样,脚本执行成功,但没有生成备份,不过,查了一下发给root的邮件,看到了问题:

  1. Return-Path: <root@test.com> 
  2. X-Original-To: root 
  3. Delivered-To: root@test.com 
  4. From: root@test.com (Cron Daemon) 
  5. To: root@test.com 
  6. Subject: Cron <root@test> sh /data/cron/backup.sh 
  7. Content-Type: text/plain; charset=UTF-8 
  8. Auto-Submitted: auto-generated 
  9. X-Cron-Env: <LANG=en_US.UTF-8> 
  10. X-Cron-Env: <SHELL=/bin/sh> 
  11. X-Cron-Env: <HOME=/root> 
  12. X-Cron-Env: <PATH=/usr/bin:/bin> 
  13. X-Cron-Env: <LOGNAME=root> 
  14. X-Cron-Env: <USER=root> 
  15. Date: Tue,  1 Apr 2014 10:58:01 -0400 (EDT) 
  16. Status: R  --phpfensi.com 
  17.  
  18. /data/cron/backup.sh: line 27: mysql: command not found 

从上面可以看到,说mysql命令没有找到,于是执行了一下命令:

  1. [root@test data]# echo $PATH 
  2. /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变量:

  1. [root@test data]# vi path.sh 
  2. #!/bin/bash 
  3.  
  4. echo $PATH 
  5.  
  6. # 保存后,加入到crontab 
  7.  
  8. [root@test data]# crontab -e 
  9.  */1 * * * * /data/path.sh 

1分钟后,可以看到:/usr/bin:/bin,知道了问题,那就好解决了,有两种.

1.在备份脚本里,手动设置一下,例如:

  1. #!/bin/bash 
  2.  
  3. . /etc/profile 
  4.  
  5. ....余下内容... 

这里需要“. /etc/profile”,是因为朋友的mysql是自己编译的,把mysql的路径都添加到这里:

PATH=$PATH:$HOME/bin:/usr/local/nginx/sbin:/usr/local/mysql/bin

export PATH

2.直接设置用户的crontab,添加路径/usr/local/mysql/bin,例如:

  1. [root@test data]# crontab -e 
  2. SHELL=/bin/bash 
  3. 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 
  4. MAILTO=root 
  5. HOME=/ 
  6. --phpfensi.com 
  7. 0 */12 * * * sh /data/cron/backup.sh 

保存之后,就可以正常备份了,另外可以了解一个文件/etc/crontab:

  1. [root@test data]# cat /etc/crontab 
  2. SHELL=/bin/bash 
  3. PATH=/sbin:/bin:/usr/sbin:/usr/bin 
  4. MAILTO=root 
  5. HOME=/ 
  6.  
  7. For details see man 4 crontabs 
  8.  
  9. # Example of job definition: 
  10. # .---------------- minute (0 - 59) 
  11. # |  .------------- hour (0 - 23) 
  12. # |  |  .---------- day of month (1 - 31) 
  13. # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ... 
  14. # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat 
  15. # |  |  |  |  | 
  16. # *  *  *  *  * user-name command to be executed

Tags: env环境变量 crontab不生效

分享到: