crontab定時任務不執行,單獨運行sh生效


雖然已經從事運維兩三年了。 但是今天寫的計划任務沒有執行,排除了下, 這里整理下,方便后期查看。

排除思路

1. 確保crond服務是開機自啟和當前是啟動的。

# centos 7
systemctl status crond
systemctl start crond

# centos 5,6
service crond  status 
chkconfig crond on

2. 檢查mail郵件里面關於該計划任務的錯誤信息。

mail 

這里借用下網絡上面的圖過來下,

這個情況,一般這些環境配置在profile文件中的, 可以在腳本中source下這個文件, 讓其生效,或者把對應的配置寫到腳本里面來。

source /etc/profile

3. 腳本里面的命令程序沒有在PATH里面。 

腳本里面執行的命令,沒有在計划任務執行的環境變量里面有, 需要添加進path或者命令寫全路徑。

# 在可以執行的終端內獲取所有PATH, 寫入腳本中
 echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/php/bin:/usr/local/docker/bin:/usr/local/java/jdk1.8.0_191/bin:/usr/local/java/jdk1.8.0_191/jre/bin:/usr/local/flume/bin:/usr/local/go/bin:/usr/local/go/bin:/root/bin


#在執行腳本中加入如下類似行

PATH=/usr/local/bin:$PATH

4. 使用bash替換

使用crontab -e編輯的計划配置行中, 命令是有限制的, 重定向和特殊符號是不支持的, 這些是bash提供的,可以使用如下方式配置。

# add by zhaojiedi 2019.08.30 
14 * * * * bash /usr/local/bin/backup_k8s.sh

 5. 封裝下計划任務腳本行

我們在計划任務行,寫的命令如果長並且帶有一些date命令等, 建議把這些命令寫入到一個新的文件里面去, 計划任務命令行寫這個新的文件作為命令執行。

# 原來計划任務行
* * * * cd /home/barry/top800/top10/top10_fruits/ && ./top10_all.sh

# 改寫后的
echo "cd /home/barry/top800/top10/top10_fruits/ && ./top10_all.sh"  > /usr/local/bin/top10.sh
* * * * * bash /usr/local/bin/top10.sh

最后放一個完整點的計划任務腳本

#!/bin/bash
source /etc/profile
PATH=/usr/local/bin:$PATH
base_dir=/alidata/k8s_backup
dt=$(date "+%F/%T")
cmd_history_file="/usr/local/limikeji/bin/cmd_history.txt"

#  先處理有命名空間的
kubectl  api-resources   |grep true  |awk 'BEGIN {OFS=" "; FIELDWIDTHS="34 13 31 13 50"}{if (NR >1)print $5,$1,$4,$3}' |while read kind name has_namespace group ; do 
        #echo "$kind $name $has_namespace $group"
        api_path="$kind"
        cmd="kubectl  get $api_path --all-namespaces -ocustom-columns=name:.metadata.name,namespace:.metadata.namespace"
        $cmd | awk '{if(NR>1)print $0}' |while read  record_name  ns ; do
                file="$base_dir/$dt/$ns/$api_path/${record_name}.yml"
                mkdir -pv $(dirname $file)
                cmd="kubectl  -n  $ns get  $api_path/$record_name -oyaml "
                echo $cmd >>$dt_$cmd_history_file
                $cmd > $file
        done
done

#  后處理無命名空間的
kubectl  api-resources   |grep false  |awk 'BEGIN {OFS=" "; FIELDWIDTHS="34 13 31 13 50"}{if (NR >1)print $5,$1,$4,$3}' |while read kind name has_namespace group ; do 
        #echo "$kind $name $has_namespace $group"
        api_path="$kind"
        cmd="kubectl  get $api_path  -ocustom-columns=name:.metadata.name"
        $cmd | awk '{if(NR>1)print $0}' |while read  record_name   ; do
                file="$base_dir/$dt/NONENAMESPACE/$api_path/${record_name}.yml"
                mkdir -pv $(dirname $file)
                cmd="kubectl  get  $api_path/$record_name -oyaml "
                echo $cmd >>$dt_$cmd_history_file
                $cmd > $file
        done
done

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM