シェルスクリプトでタイマー作って指定日時にプログラムを実行する

業務で長時間かかる処理を夜間に実行したかったので、シェルスクリプトでタイマー ( timer ) を作成して、指定の時刻に自動実行できるようにした。標準的なコマンドや自作コマンドも実行可能。

実行例
ex1) ./timer "2024-02-17 23:00:00" mycommand param1 param2
ex2) ./timer "2024-02-17 02:30:00" find . -exec ls -l {} \;

 1#!/bin/bash
 2#
 3# ファイル名:timer
 4# 概要      :指定した日時にコマンドを実行する
 5# 実行形式  :./timer <datetime> <command> ...
 6# 備考      :<command>の引数を指定可能(可変引数OK)
 7#
 8
 9# 引数の数をチェック
10if [ $# -le 1 ];then
11    echo "usage: timer <datetime> <command> ..."
12    exit 1
13fi
14
15# 第一引数チェック
16# 指定日時のUNIX時間(UNIXエポックからの経過秒数)を取得
17target=$(date -d "$1" +"%s") # macの場合は date -j -f "%Y-%m-%d %H:%M:%S" "$1" "+%s"
18if [ $? -ne 0 ];then
19    echo 'invalid date format. ex)"2024-02-17 13:59:00"'
20    exit 1
21fi
22
23# 第二引数チェック
24command=$2
25which $command >& /dev/null # 標準コマンドであるかのチェック
26if [ $? -ne 0 ];then
27    # 標準コマンドでない場合、指定コマンドの存在チェックと権限チェック
28    if [ ! -x $command ];then
29        echo "$command is not found or not executable"
30        exit 1
31    fi
32fi
33
34# 現在日時のUNIX時間を取得
35current=$(date +"%s")
36
37# 指定日時と現在日時の秒数の差を取得
38sleep_sec=$((target - current))
39
40# 指定日時まで待機
41if [ $sleep_sec -gt 0 ];then
42    sleep $sleep_sec
43fi
44
45# コマンド実行
46PATH="$PATH:." # カレントにパスを通しておく
47${@:2}  # 第二引数以降を指定することで、<command>の引数を指定することも可
48
49exit 0
50

関連ページ