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