リストエラーシェルスクリプトがありますが、毎日手動で実行します。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日ごとに実行されます。)
答え2
標準のSolarisシステム(GNU日付なし)でこれを行うことができます(わずかな水平思考を介して)。
2時間ごとにスクリプトを実行するようにクローンジョブを設定します。
入力時にスクリプトが実行date
され、現在の日時を「開始」パラメーターとして保存します。
その後、7200秒間スリープモードに入ります。
スリープモードの有効期限が切れると、再度実行され、date
現在の日時を "end"パラメータとして保存します。
これで、最初の2時間のデータを抽出するために必要な4つの値が作成されました。結果のファイル名の一部として終了の開始と日付を使用することもできます。
答え3
バージョン11以降、Solarisには/bin/sh
実際に高度な日付操作と書式設定機能が組み込まれています(実際にはGNUよりもはるかに高度です)。ksh93
printf
date
明示的に標準構文ではないと言う#! /bin/ksh93 -
代わりにksh93構文を使用します(bashシステムのスクリプトでbashismを使用しないかのように)。#! /bin/sh -
sh
#! /bin/sh -
sh
#! /bin/ksh93 -
eval "${
printf '
ent programe %(-a%Y%m%d -b%H%M%S)T %(-c%Y%m%d -d%H%M%S)T -tTE -oListErrorTE.txt
' '2 hours ago' now
}"
grep ' ERR1' ListErrorTE.txt
grep ' ERR2' ListErrorTE.txt