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

 
linux下env环境变量引起的crontab不生效解决办法
2016-09-26 19:31:26 /故事大全

crontab是linux中一个定时任务功能了,但是小编使用env环境变量之后迫害前的任务计划没效了,下面我们来看看如何解决env环境变量引起的crontab不生效问题.

有朋友说,他写了一个脚本来做计划任务定时备份数据库,但却一直都备份不成功,手动执行脚本也没有问题,而且在/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

/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=/

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

所属专题:
如果您觉得本文或图片不错,请把它分享给您的朋友吧!

 
故事大全
 
版权所有- © 2012-2015 · 故事大全 SITEMAP站点地图-Foton Auman手机看故事 站点地图-Foton Auman