加入收藏 | 设为首页 | 会员中心 | 我要投稿 财气旺网 - 财气网 (https://www.caiqiwang.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

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

发布时间:2022-06-19 22:05:03 所属栏目:教程 来源:互联网
导读:有朋友说,他写了一个脚本来做计划任务定时备份数据库,但却一直都备份不成功,手动执行脚本也没有问题,而且在/var/log/cron日志里看到成功执行了,但就是没看到备份的数据库文件. 拿了ssh权限,登录之后,看了之后,和他所说的情况一样,脚本执行成功,但没有生成备
  有朋友说,他写了一个脚本来做计划任务定时备份数据库,但却一直都备份不成功,手动执行脚本也没有问题,而且在/var/log/cron日志里看到成功执行了,但就是没看到备份的数据库文件.
 
  拿了ssh权限,登录之后,看了之后,和他所说的情况一样,脚本执行成功,但没有生成备份,不过,查了一下发给root的邮件,看到了问题:
 
  Return-Path: <root@test.com>
  X-Original-To: root
  Delivered-To: root@test.com
  From: root@test.com (Cron Daemon)
  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,  1 Apr 2014 10:58:01 -0400 (EDT)
  Status: R  --phpfensi.com
  
  /data/cron/backup.sh: line 27: mysql: command not found
  从上面可以看到,说mysql命令没有找到,于是执行了一下命令:
 
  [root@test data]# 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@test data]# vi path.sh
  #!/bin/bash
  
  echo $PATH
  
  # 保存后,加入到crontab
  
  [root@test data]# 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@test data]# 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@test data]# cat /etc/crontab
  SHELL=/bin/bash
  PATH=/sbin:/bin:/usr/sbin:/usr/bin
  MAILTO=root
  HOME=/
  
  # For details see man 4 crontabs
  
  # Example of job definition:
  # .---------------- minute (0 - 59)
  # |  .------------- hour (0 - 23)
  # |  |  .---------- day of month (1 - 31)
  # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
  # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
  # |  |  |  |  |
  # *  *  *  *  * user-name command to be executed。
 

(编辑:财气旺网 - 财气网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!