※当サイトの記事には、広告・プロモーションが含まれます。

シェルスクリプトでタイムアウト判定を実施してみる

cloud.watch.impress.co.jp

 11月に開催されたLinuxカーネル開発者の会議「Linux Kernel Summit」で話しあわれたという「メンテナー疲れ」の話題も出た。Torvalds氏は、メンテナーには通常の開発者と違うスキルがあり、ほかの人の書いたコードがいいアプローチかどうか見極める鑑識眼を持っている必要があるという。これは何年もやっていて身につく部分があるため、メンテナーはなかなか代わりがきかないという。

Linus Torvalds氏、「テクノロジーは飛躍的に発展するものではなく一歩一歩進むものだ」 - クラウド Watch

 さらに「私は常に、エンジニアに拍手を送る。『10年後にはこうなる』といったことは言いたくない。テクノロジーでは長期的な計画はうまくいかない」とTorvalds氏。「近場でドタバタしていて山頂にたどりつかないこともあるかもしれないが、テクノロジーは飛躍的に発展するものではなく、一歩一歩進むものだ」と語った。

Linus Torvalds氏、「テクノロジーは飛躍的に発展するものではなく一歩一歩進むものだ」 - クラウド Watch

⇧ 技術調査・理解に時間がかかるし、技術が刷新されたりもしてキャッチアップに時間取られて、技術以外にもシステムに必要なドメイン知識の理解にも時間が取られたりするから、計画通りにいかないのは、エンジニアあるあるですな。

そして、大抵、期待した通りに動かないから、動作検証に時間が取られるのが当然だし、不具合が出てきたら原因調査・分析・方針策定・改修にも必然的に時間が取られますからな...

システムを構築・維持していくには、膨大な時間と工数がかかるということは、エンジニア的な作業を経験していない人にはなかなか伝わり辛いところかとは思いますが...

シェルスクリプトタイムアウト判定を実施してみる

シェルスクリプトタイムアウト判定する時にエポック秒を使うと良いと教えていただいたので、備忘録として。

そも、エポック秒とは?

In computing, an epoch is a fixed date and time used as a reference from which a computer measures system time. Most computer systems determine time as a number representing the seconds removed from a particular arbitrary date and time. For instance, Unix and POSIX measure time as the number of seconds that have passed since Thursday 1 January 1970 00:00:00 UT, a point in time known as the Unix epochWindows NT systems, up to and including Windows 11 and Windows Server 2022, measure time as the number of 100-nanosecond intervals that have passed since 1 January 1601 00:00:00 UTC, making that point in time the epoch for those systems.

https://en.wikipedia.org/wiki/Epoch_(computing)

Computing epochs are nearly always specified as midnight Universal Time on some particular date.

https://en.wikipedia.org/wiki/Epoch_(computing)

⇧ コンピューターがシステム時間の基準として参照する固定の日付と時刻のことを、「epoch」と言うらしいですと。

で、Linuxは、

UNIX時間(ユニックスじかん)またはUNIX時刻(ユニックスじこく、UNIX time(ユニックスタイム)、POSIX time(ポジックスタイム))とはコンピューターシステム上での時刻表現の一種。協定世界時 (UTC) での1970年1月1日午前0時0分0秒(UNIXエポック)から形式的な経過秒数として表される。

UNIX時間 - Wikipedia

表現できる日付の範囲

UNIXエポックからの経過時間を表現する際の単位として、秒以外にも、様々な単位を使うことができ、秒とナノ秒が利用されることが多めであるが、最初の Java や JavaScript はミリ秒を採用していた(java.lang.System.currentTimeMillis() など)。

UNIX時間 - Wikipedia

UNIX、ないしは、POSIXの時間を「epoch」とするようで、基本的には、「秒」が「epoch」のスタンダードということみたい。

「秒(seconds)」以外にも、「ミリ秒(mill seconds)」「マイクロ秒(micro seconds)」「ナノ秒(nano seconds)」が「epoch」の時間単位として用意されてる模様。

表現できる日付の範囲

UNIX時間 - Wikipedia

⇧ 64bitであれば、2038年問題の心配は無い模様。

Linuxのdateコマンドで、エポック秒は取得できるのですが、

man7.org

DESCRIPTION

FORMAT controls the output.  Interpreted sequences are:
%s     seconds since the Epoch (1970-01-01 00:00 UTC)
%S     second (00..60)

UNIX時間 - Wikipedia

⇧ 小文字の方がエポック秒で、大文字だと単なる秒になるので要注意ですかね。

で、

qiita.com

⇧ 上記サイト様を参考にさせていただきました。

■/home/ts0818/work/test_timeout/test_timeout.sh

#!/bin/bash

function epoch_time_seconds() {
  date +'%s'
}

function epoch_to_datetime() {
  date -d "@${1}" +"${2:-%F %T}"

}

TIMEOUT_SECONDS=10

start_time=$(epoch_time_seconds)
passed_time=0

echo "[$(epoch_to_datetime ${start_time})]start test_timeout.sh"

# 無限ループ
# (時間のかかる処理の代替として)
while true
do
  if [ ${passed_time} -eq 0 ]; then
    echo "start while loop."

  fi
  
  sleep 1
  passed_time=$(( $(epoch_time_seconds) - ${start_time} ))
  echo "passed ${passed_time} seconds."
  
  # タイムアウトの場合
  if [ ${passed_time} -ge ${TIMEOUT_SECONDS} ]; then
    echo "over ${TIMEOUT_SECONDS} seconds. it's timeout."
    echo "break while loop."
    # 無限ループを抜ける
    break;

  fi

done

echo "[$(date +'%F %T')]finish test_timeout.sh"  

⇧ で、実行してみると、

タイムアウトの判定ができてそうです。

今回はこのへんで。