mikan's technical note

仕事&趣味で実験した小技の備忘録です(Linux,windows,DOS等)

MENU

【shell】シェルでat,cronコマンドもどき(諸事情でatやcronを使いたくない場合に)

#!/usr/bin/bash
############################################################
### 【シェルでat,cronコマンドもどき】※bashでのみ動作確認済
### (c) 2017 mikan
### ※使用にあたっては利用者の自己責任でお願いします。
###
###   使い方:
###       各種定義の、RUN_TIME、CUT、の内容を設定する。
###       ########## start ########## ~
###       ########## end   ########## の間に、
###       実行したい処理を書く。
###
###   起動方法:
###       例1)nohup 本シェル名 &
###       例2)本シェル名
###
###   終了方法:
###       例1)touch end.flg(本シェルと同じパスに作成)
###       例2)Ctrl+C
############################################################

############################################################
### 各種定義
############################################################
### 毎日 21:05 に起動
RUN_TIME="2105"
CUT="cut -c1,2,3,4"

### 毎自 HH:15 に起動
#RUN_TIME="HH05"
#CUT="cut -c3,4"

### 終了判定ファイル(存在したら終了します)
END_FILE="end.flg"

############################################################
### メイン処理
############################################################
### 自シェルの絶対パス
MYPATH=`(cd $(dirname $0) && pwd)`

### 自シェル名(パスなし)
MYNAME=`basename $0`

### 二重起動チェック
if [ $$ != `pgrep -fo $0` ]; then
    echo
    date
    echo [$MYPATH/$MYNAME] is already started.
    echo exit command is \'touch end.flg\'.
    exit
fi

### 開始メッセージ
echo
date
echo [$MYPATH/$MYNAME] is start.
echo exit command is \'touch end.flg\'.

### ループ処理
NOW_W=""
while [ 1 ]; do
#   ### 終了判定
    NOW=`date +%H%M | $CUT`
    if [ -e $MYPATH/$END_FILE ]; then
        date
        echo "find the [$MYPATH/$END_FILE] !"
        rm $MYPATH/$END_FILE
        break
    fi

#   ### 指定時刻と一致したら実行
#   ### (1回だけでいいなら、ifの中でbreakしましょう)
    RUN_TIME_W=`echo $RUN_TIME | $CUT`
    if [ $RUN_TIME_W = $NOW ] && [ $NOW != $NOW_W ]; then
        echo
        date
        echo "########## start ##########"
        echo "ここに実行したい処理を書きましょう"
        echo "別のshlを呼んでもOKです"
        echo "########## end   ##########"
        date
    fi
    NOW_W=$NOW

#   ###スリープ
    sleep 30
done

### 終了メッセージ
echo
date
echo [$MYPATH/$MYNAME] is finish.

exit 0