Linuxで2つの時刻の引き算して時刻を計算する

2020-03-10

2つの時刻を引き算して経過時間を計算する方法

ある時刻から今の時刻を引き算して起動している時間を求める方法を紹介します。
運用では通常はすぐに終了するプロセスが、10分以上動いているアラート上げるなどの運用で使う機会も考えられますね。その方法を紹介します

計算方法ですが、2つの時刻をUNIX時刻に変換してから引き算をしてその差を求めて時刻を計算します。UNIX時刻は、1970年1月1日0時UTCからのうるう秒を考慮しない秒数で、コマンドは「date +%s」で表示できます。

下記のスクリプトでは、httpdのプロセスで一番古く起動しているプロセスが10分以上あるかどうか調べているスクリプトです

PID=`ps -ef kstart_time | grep httpd | grep -v grep | head -1 | awk '{print $2}'`

if [ -n "$PID" ]; then
  TIME=`ps -o lstart --noheader -p $PID`

  if [ -n "$TIME" ]; then
    StartupTime=`date +%s -d "$TIME"`
    CurrentTime=`date +%s`
    ElapsedTime=`expr $CurrentTime - $StartupTime`
  else
    ElapsedTime=1
  fi

  if [ $ElapsedTime -gt 600 ]; then
    echo "10分以上起動しているhttpdプロセスがあります"
  else
    echo "10分以上起動しているhttpdプロセスがありません"
    fi
fi

 

httpdプロセスで一番古い起動時間のプロセスIDを取得しています

PID=`ps -ef kstart_time | grep httpd | grep -v grep | head -1 | awk '{print $2}'`

1.取得したプロセスIDより起動時刻(TIME)を取得しています
2.起動時刻をUNIX時刻に変換(StartupTime)しています
3.現在の時刻をUNIX時刻に変換(CurrentTime)しています
4.UNIX時刻で引き算をして、経過時間(ElapsedTime)を取得しています
TIME=`ps -o lstart --noheader -p $PID`
StartupTime=`date +%s -d "$TIME"`
CurrentTime=`date +%s`
ElapsedTime=`expr $CurrentTime - $StartupTime`

この処理ですが、取得したプロセスIDのプロセス終了したりするケースだと$TIMEが取得できませんのでその場合は経過時刻を1秒とするようにしています
if [ -n "$TIME" ]; then
 〜省略〜
else
 PTIME=1
fi

経過時刻が600秒以上の場合で処理を分けています、この処理でプロセスをKillしたりメールしたりする処理を追加すれば良いと思います
if [ $ElapsedTime -gt 600 ]; then
  echo "10分以上起動しているhttpdプロセスがあります"
else
  echo "10分以上起動しているhttpdプロセスがありません"
fi

プロセスのKillする方法ですが、以下の記事で長時間起動したままのプロセスをKillする方法を紹介しているので参考にして下さい

起動時間が一定以上したプロセスをKillするスクリプト

スポンサーリンク