mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

Bash - プロセス起動中・CPU 時間チェック!

[ サーバ構築 ] [ Linux, bash, シェル ]

こんばんは。

Linux 上で指定のプロセスが起動中か否か、CPU 時間が指定の時間を超えているか否かをチェックする Bash スクリプトの紹介です。

Linux サーバ上で短い間隔で cron 起動する場合に、前に起動したプロセスが終了しないうちに同じプロセスが二重に起動すると困る。
また、何らかの理由でプロセスが終了せずに永遠と残り続けていないかのチェックも行いたい。

そんな場合に使えるかと思います。(以下で紹介するスクリプトはシンプルなものにです。実際は応用を効かせてください)

0. 前提条件

  • Linux Mint 17(64bit), CentOS 6.6, 7.0 での動作を想定。
  • Bash 4.3.11(Linux Mint 17), 4.1.2(CentOS 6.6), 4.2.45(CentOS 7.0) を想定。

1. 作成する Bash スクリプトの概要

  1. プロセス起動個数取得。
  2. 起動プロセス個数別に処理。
    • 起動プロセス数が 0 個なら、リターンコードを 0 にして終了。
    • 起動プロセス数が 1 個なら、CPU 時間取得。
      • CPU 時間 < 指定値 なら、リターンコードを 1 にして終了。
      • CPU 時間 ≧ 指定値 なら、リターンコードを 2 にして終了。
    • 起動プロセス数が 2 個以上なら、リターンコードを 3 にして終了。

また、

  • Bash スクリプト中で Linux コマンドの ps, grep, wc, awk を使用している。
  • ps コマンドのオプションは Linux オプションである(BSD オプションとは異なる)ことに注意。
  • ps -ef で取得される結果の7番目に CPU 時間が HH:MM:SS の書式で格納されていることを認識しておく。

2. Bash スクリプトの作成

ps_check.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/bin/bash
# ------------------------------------------------------------
# Bash script to check processes.
# ------------------------------------------------------------
# RETURN CODE
#    0: processes are not running.
#    1: one process is running. (CPU time <  configured value)
#    2: one process is running. (CPU time >= configured value)
#    3: more than two processes are running.
# ------------------------------------------------------------
#
PS_NAME="<process_name>"
CPU_MAX=000100  # Format: `HHMMSS`

# Process counts
CNT=`ps -ef | grep -e "$PS_NAME" | grep -v grep | wc -l`

if [ $CNT -eq 0 ]; then
    echo "[RET-CODE:0] processes are not running."
    exit 0
elif [ $CNT -eq 1 ]; then
    # CPU time
    TM=`ps -ef | grep -e "$PS_NAME" | grep -v grep | awk '{ print $7 }'`
    TM=${TM:0:2}${TM:3:2}${TM:6:2}

    if [ $TM -lt $CPU_MAX ]; then
        echo "[RET-CODE:1] one process is running. (CPU time <  configured value)"
        exit 1
    else
        echo "[RET-CODE:2] one process is running. (CPU time >= configured value)"
        exit 2
    fi
else
    echo "[RET-CODE:3] more than two processes are running."
    exit 3
fi

3. Bash スクリプトの実行

1
2
$ ./ps_check.sh
[RET-CODE:2] one process is running. (CPU time >= configured value)

当方の場合、実際の Bash スクリプト内で、指定プロセスの CPU 時間が長過ぎるような場合に root 宛にメール送信するなどしています。

以上。

Comments