近段時間使用crontab 定時執行shell腳本,來解析java項目日誌,實現「日誌解析」跟項目的業務邏輯解耦。編寫shell腳本時卻是挺順利的,但在添加crontab定時執行shell腳本時,遇到了麻煩事。java
問題是這樣的。個人shell腳本主要的代碼是:(文件名爲test.sh)shell
declare -i ibash
i=0ide
log_path=/home/testdata測試
cd $log_path命令行
nowdate=$(date +%Y%m%d%H)日誌
for file in `ls -1| grep -v completed | grep -v $nowdate |grep login.`crontab
doit
file_list[$i]=$fileclass
i=`expr $i + 1`
echo ${file_list[$i-1]}
done
在命令行裏執行/bin/bash test.sh ,能打印出篩選出的日誌文件名。到這裏感受應該問題不大了。因而設置crontab定時任務(每分鐘執行一次):
*/1 * * * * bash /tmp/shell_tasks/test.sh > /tmp/testlog.log 2> &1
這個時候問題來了: crontab任務沒有反應!!!典型的問題,單獨執行shell腳本沒有問題,放到crontab裏就不行!!!
根據前輩們的經驗,這分明就是crontab的環境跟bash的不同致使的。
給出解決方案有:
一、crontab命令裏儘可能使用全路徑:/bin/bash
*/1 * * * * /bin/bash /tmp/shell_tasks/test.sh > /tmp/testlog.log 2> &1
二、shell腳本里要直接引入環境變量:
首先是shell腳本開頭添加這麼一行:#!/bin/bash (注意,每一個字符之間都不要有空格)
這是在告訴系統,要用/bin/bash 的命令解釋器來執行腳本。
其次是引入profile文件裏的環境變量,即添加這麼一行: source /etc/profile
最後就能夠測試是否生效了。
後記: 在Linux裏面,bash 和crontab 是兩個不一樣的程序,crontab沒有去直接獲取bash的環境變量,致使二者並不是必定能同時生效。