1. 程式人生 > >Linux筆記:定時任務和檔案操作

Linux筆記:定時任務和檔案操作

檢視定時任務

crontab -l

  • 註冊定時任務

 

crontab -e
然後就像 vim 一樣編輯自己的定時任務。
如:
 * * * * * . /home/hadoop/timer/check_job.sh >> /home/hadoop/timer/logs/check_job.log

  • 定時任務解析

 

  1. *和*之間的空格,是必須的
  2. *分別代表:分,時,日,月,周
    • 1. 分 的取值範圍為:0-59
    • 2. 時 的取值範圍為:0-23
    • 3. 日 的取值範圍為:1-31
    • 4. 月 的取值範圍為:1-12
    • 5. 周 的取值範圍為:0-7 
  3. *後面是需要執行的命令
  4. "." 代表是shell 命令,也可以使用 sh
  5. ">>" 前面的是需要定時呼叫的shell,後面是 需要輸出的 log 檔案的位置​
  • 例項

 

1.  * * * * * 代表每分鐘執行一次,也可以寫成 */1 * * * *,/1代表一分鐘執行一次 
2.  30 */1 * * * 代表每小時的 30 分執行一次 


以下是對檔案的操作

  • 根據檔名稱取得最大日期對檔案
    • 檔名稱的格式為:filter_cache_20171101.se 
    max_date=0
    # get the latest file and copy to hdfs
    cd /home/hadoop/.../checkpoint/filter
    for dir in $(ls -l ./ | awk '/^d/{print $NF}')
    do
       if [[ -d $dir && $dir == *\_* ]]; then
          f_d=$(echo $dir | cut -d \_ -f 3 | cut -d \. -f 1)
          if [[ $max_date < $f_d ]]; then
            max_date=$f_d
            max_filter=$dir
          fi
       fi
    done
    echo " max date is : "$max_date
    echo " max filter is : "$max_filter

 

  • 複製最近日期對檔案到hdfs
    • 如果檔案存在,提示已經存在
    hadoop fs -test -e /data/.../bloom_filters/$max_filter
    if [[ $? == 0 ]]; then
        echo " filter is already exist : "$max_filterF
    else
        echo " start hdfs copy "
        hadoop fs -put $max_filter /data/.../bloom_filters
    fi
  • 設定需要刪除過期檔案的指定時間
    remove_week=$(date -d "$max_date 7 days ago" +%Y%m%d)
    echo " 刪除本地序列化檔案的日期界限:"$remove_week
    remove_date=$(date -d "$max_date 30 days ago" +%Y%m%d)
    echo " 刪除檔案 和 Hadoop filter 的日期界限:"$remove_date
  • 刪除指定日期30天以外的本地檔案,並且刪除小於指定日期7天以外的指定資料夾的檔案
    for r_dir in $(ls -l ./ | awk '/^d/{print $NF}')
    do
       if [[ -d $r_dir && $r_dir == *\_* ]]; then
          r_d=$(echo $r_dir | cut -d \_ -f 3 | cut -d \. -f 1)
          if [[ $r_d < $remove_date ]]; then
              echo " remove filter_dir is: "$r_dir
              rm -r $r_dir
          elif [[ $r_d < $remove_week ]]; then
              echo " remove filter is: "$r_dir
              rm -r $r_dir/*.FILTER.SER
          fi
       fi
    done

 

  • 刪除hdfs上指定日期30以外的檔案
    for h_filter in $(hadoop fs -ls /data/.../bloom_filters | awk '{print $8}')
    do
        if [[ $h_filter == *\_* ]]; then
            h_date=$(echo $h_filter | cut -d \/ -f 6 | cut -d \_ -f 3 | cut -d \. -f 1)
    #        echo " hdfs date : "$h_date
    #        echo " hdfs filter : "$h_filter
            if [[ $h_date < $remove_date ]]; then
                echo " remove hdfs filter is : "$h_filter
                hadoop fs -rmr $h_filter
            fi
        fi
    done