技術(shù)員聯(lián)盟提供win764位系統(tǒng)下載,win10,win7,xp,裝機純凈版,64位旗艦版,綠色軟件,免費軟件下載基地!

當前位置:主頁 > 教程 > 服務(wù)器類 >

linux下env環(huán)境變量引起的crontab不生效解決辦法

來源:技術(shù)員聯(lián)盟┆發(fā)布時間:2018-04-25 12:01┆點擊:

crontab是linux中一個定時任務(wù)功能了,但是小編使用env環(huán)境變量之后迫害前的任務(wù)計劃沒效了,下面我們來看看如何解決env環(huán)境變量引起的crontab不生效問題.

 

 

有朋友說,他寫了一個腳本來做計劃任務(wù)定時備份數(shù)據(jù)庫,但卻一直都備份不成功,手動執(zhí)行腳本也沒有問題,而且在/var/log/cron日志里看到成功執(zhí)行了,但就是沒看到備份的數(shù)據(jù)庫文件。

拿了ssh權(quán)限,登錄之后,看了之后,和他所說的情況一樣,腳本執(zhí)行成功,但沒有生成備份。

不過,查了一下發(fā)給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=http://www.3lian.com/bin/sh>
X-Cron-Env: <HOME=http://www.3lian.com/root>
X-Cron-Env: <PATH=http://www.3lian.com/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命令沒有找到,于是執(zhí)行了一下命令:

[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里的執(zhí)行環(huán)境變量與root用戶設(shè)置的環(huán)境變量不一致,從上面兩個可以看出區(qū)別:
crontab里的環(huán)境變量:X-Cron-Env: <PATH=http://www.3lian.com/usr/bin:/bin>

root用戶的環(huán)境變量:
PATH=http://www.3lian.com/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/nginx/sbin:/usr/local/mysql/bin

現(xiàn)在我們已經(jīng)知道了,mysql這個命令是放在/usr/local/mysql/bin下面,而crontab的PATH變量中卻沒有這一條,所以出現(xiàn)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. 在備份腳本里,手動設(shè)置一下,例如:

#!/bin/bash
 
. /etc/profile
 
....余下內(nèi)容...
這里需要“. /etc/profile”,是因為朋友的mysql是自己編譯的,把mysql的路徑都添加到這里:
PATH=$PATH:$HOME/bin:/usr/local/nginx/sbin:/usr/local/mysql/bin
export PATH

2. 直接設(shè)置用戶的crontab,添加路徑/usr/local/mysql/bin,例如:
[root@test data]# crontab -e
SHELL=http://www.3lian.com/bin/bash
PATH=http://www.3lian.com/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=http://www.3lian.com/
 
0 */12 * * * sh /data/cron/backup.sh

保存之后,就可以正常備份了。

另外可以了解一個文件/etc/crontab:
[root@test data]# cat /etc/crontab
SHELL=http://www.3lian.com/bin/bash
PATH=http://www.3lian.com/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=http://www.3lian.com/
 
# 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