リストエラーシェルスクリプトがありますが、毎日手動で実行します。crontab
スクリプトを自動的に実行したいです。
私のスクリプト:
#!/bin/sh
ent programe -a$1 -b$2 -c$3 -d$4 -tTE -oListErrorTE.txt
grep " ERR1" ListErrorTE.txt
grep " ERR2" ListErrorTE.txt
説明する:
$1 = date start >> 20230914
$2 = time start >> 000100
$3 = date end >> 20230914
$5 = time end >> 163000
2時間前に開始するパラメータの日付/時刻を変更し、終了日/時刻を現在の日付/時刻に置き換えたいですか?
ベストアンサー1
スクリプトは、コマンドラインで開始日時と終了日時に対応する4つのパラメータを使用し、特定のパラメータを指定せずにスクリプトを呼び出そうとします。代わりに、開始日時を「2時間前」に、終了日時を「今」に設定しようとしています。
Solarisシステムにdate
GNUがインストールされているとします(ユーティリティ上場公式のSolarisマニュアルにあるので、少なくとも管理者が提供できます)これを使用して、次の4つのパラメータの値を計算できます。
/some/path/yourscript \
"$(date -d '2 hours ago' +%Y%m%d)" \
"$(date -d '2 hours ago' +%H%M%S)" \
"$(date +%Y%m%d)" \
"$(date +%H%M%S)"
このコマンドが2023年9月14日09:44:03に実行された場合、スクリプトは4つのパラメータと20230914
一緒074403
に20230914
呼び出されます094403
。
4つのコマンド置換は、GNUを使用してdate
必要な4つの日付とタイムスタンプを計算して返します。
心配している4つの呼び出しのうちのいくつかが秒、分、時間date
、日などの異なる側面にある場合は、まず「今」というUnixタイムスタンプを取得し、そのタイムスタンプのオフセットを使用しdate
て目的のタイムスタンプを取得します。日付と時刻のスタンプ:
now=$(date +%s)
offset=$(( -2*60*60 )) # -2h in seconds
/some/path/yourscript \
"$(date -d "@$(( now + offset ))" +%Y%m%d )" \
"$(date -d "@$(( now + offset ))" +%H%M%S )" \
"$(date -d "@$now" +%Y%m%d )" \
"$(date -d "@$now" +%H%M%S )"
GNUはありませんが、date
かなり最新バージョンbash
(バージョン4.2以降)があります。公式文書):
printf -v now '%(%s)T' -1
offset=$(( -2*60*60 )) # -2h in seconds
/some/path/yourscript \
"$( printf '%(%Y%m%d)T' "$(( now + offset ))" )" \
"$( printf '%(%H%M%S)T' "$(( now + offset ))" )" \
"$( printf '%(%Y%m%d)T' "$now" )" \
"$( printf '%(%H%M%S)T' "$now" )"
これは、以前のコードスニペットと同様に、組み込みユーティリティprintf
の特別な日付書式設定機能を使用します。bash
まず、Unixタイムスタンプ「今」(シェル変数に保存now
)を計算し、それを使用して「2時間前」オフセットを計算し、フォーマットされた日付とタイムスタンプをスクリプトの引数として出力します。
クローン操作の場合は、コードスニペットを取得して予約します。yourscript-runner
非常に長いコマンドをcrontabファイルに直接挿入しようとするよりも、cronで予約されている別のスクリプトにコードを入れるのが最も合理的です。%
部分的には、その文字はcron予約で特別でエスケープする必要があるためです。また、必要に応じてタスクを手動で実行できる別のスクリプトも提供します。
0 0 * * * /some/path/yourscript-runner
(上記のクローンスケジュールは深夜1日ごとに実行されます。)