Linuxで2つの時刻の引き算して時刻を計算する
Contents
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する方法を紹介しているので参考にして下さい
ディスカッション
コメント一覧
まだ、コメントがありません