shell腳本在shell終端中執行沒問題,但在crontab中定時執行時不生效

問題描述

最近在項目遇到一個問題,想定時檢查logstash進程是否掛掉,若掛掉自動啓動。於是利用linux的crontab功能,添加一個計劃任務,每分鐘執行一個腳本查看logstash的進程是否還在,如果不在則啓動之,否則不做任何事情。
結果發現這個腳本在shell終端手工運行能夠正常執行,但是加到crontab中定時執行時卻沒有生效。

腳本如下:log_up.sh

#!/bin/bash
time=$(date "+%Y-%m-%d %H:%M:%S")
echo $time >> /data/1.log
echo "start" >> /data/1.log
ps -fe|grep /data/logstash|grep -v grep
if [ $? -ne 0 ]
then
echo "logstash 未啓動" >> /data/1.log
nohup /data/logstash/bin/logstash -f /data/logstash/logstash.conf &
echo "logstash 完成啓動" >> /data/1.log
else
echo "logstash 正在運行" >> /data/1.log
fi
echo "end" >> /data/1.log
echo " " >> /data/1.log

問題重現過程

  1. 停掉logstash
  2. 將上述腳本log_up.sh添加到crontab中,每一分鐘執行一次,並將結果輸出在/data/1.log文件中
    執行結果如下:
    在這裏插入圖片描述
    從執行的log日誌中看,腳本確實判斷除了當前logstash沒運行,然後執行了logstash啓動腳本,但結果沒有啓動成功。
    在shell終端中,手動執行log_up.sh腳本,結果如下:
    在這裏插入圖片描述
    可以看到,啓動成功了。從執行日誌中看,手動執行後,後續crontab自動執行腳本,監測到logstash已啓動
    在這裏插入圖片描述
    因此,crontab中自動執行log_up.sh沒有啓動成功,問題可能就出在logstash啓動的命令。
nohup /data/logstash/bin/logstash -f /data/logstash/logstash.conf &

問題解決

經過一番百度,發現問題可能出在環境變量上,於是在腳本中加入一條語句,執行時將環境變量輸出到日誌中,

echo $PATH >> /data/1.log

手動執行腳本時,輸出的環境變量爲:/usr/java/jdk1.8.0_211/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
而crontab自動執行後,輸出的環境變量爲:/usr/bin:/bin

在log_up.sh加入一行代碼:

export PATH="/usr/java/jdk1.8.0_211/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"

保證腳本在crontab中運行時和在shell中手動執行時相同的環境變量,結果發現腳本在crontab中可以執行成功。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章