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

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

(0)

相关推荐

  • linux下设定环境变量的方法介绍

    那么需要将export命令写入某个系统文件中,拥有这种功能的文件常见的有如下几个: /etc/environment 或 /etc/profile 或 ~/.profile 或 /etc/bash.b ...

  • Linux系统下修改环境变量PATH路径的三种方法

    电脑中必不可少的就是操作系统。而Linux的发展非常迅速,有赶超微软的趋势。这里介绍Linux的知识,让你学好应用Linux系统。比如要把/etc/apache/bin目录添加到PATH中,方法有三: ...

  • win7下修改环境变量PATH的两种方式

    设置环境变量有两种方式:第一种是在命令提示符运行窗口中设置;第二种是通过单击“我的电脑→属性→高级”标签的“环境变量”按钮设置。需要注意的是,第一种设置环境变量的方式只对当前运行窗口有效,关闭运行窗口 ...

  • Linux如何设置环境变量

    Linux是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统,今天给大家分享一下Linux如何设置环境变量. 操作方法 01 方法一:用export命令,输入"e ...

  • win7(windows7)下java环境变量配置方法

    win7(windows7)下java环境变量配置方法,java需要自己动手配置环境变量,下面我给介绍一下我本人配置的方法 ,希望对大家有帮助! 操作方法 01 1.用鼠标右击"我的电脑&q ...

  • linux系统挂载以及卸载USB接口的设备的解决办法

    Linux如何挂载一个USB设备通常,在Linux系统中,如果要使用硬盘、光盘、软盘或U盘等存储设备,一般先要挂载(但有些高版本的Linux可以做到自动识别和加载设备)。当存储设备挂载完成后就可以像目 ...

  • Win10一周年更新预览版系统下开始菜单所有应用列表空白现象的解决办法

    对于Win10 PC预览版开始菜单中点击“所用应用”出现空白的Bug,可能各位Insider已经见怪不怪了,这个问题在微软最近推送的一周年预览版14328中依然没有修复,但是目前还是有可以解决Win1 ...

  • linux配置java环境变量详细步骤

    一. 解压安装jdk 在shell终端下进入jdk-6u14-linux-i586.bin文件所在目录, 执行命令 ./jdk-6u14-linux-i586.bin 这时会出现一段协议,连继敲回车, ...

  • linux配置oracle环境变量

    Oracle10G 最低系统要求:内存:推荐1G,,在虚拟机中为768MSwap分区:1G,设为内存的2倍/tmp磁盘空间:400MB以上磁盘空间:软件3.5G 数据1.2G 所需软件:SUSE Li ...