crontab 定時執行shell腳本遇到的問題

近段時間使用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的環境變量,致使二者並不是必定能同時生效。

相關文章
相關標籤/搜索