現在のタイムスタンプを使用してSolarisでスクリプトを呼び出すにはどうすればよいですか?

現在のタイムスタンプを使用してSolarisでスクリプトを呼び出すにはどうすればよいですか?

リストエラーシェルスクリプトがありますが、毎日手動で実行します。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システムにdateGNUがインストールされているとします(ユーティリティ上場公式の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一緒07440320230914呼び出されます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よりもはるかに高度です)。ksh93printfdate

明示的に標準構文ではないと言う#! /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

関連情報