= サーバープロセスの定期保存 = == 概要 == psコマンドによるサーバー毎の状態を定期保存する方法を紹介する。[[br]] psコマンドの結果をログとして保存するスクリプトをcronで10毎に実行している。 == ディレクトリ構成 == {{{ ServerProcess |-- script | |-- snap.sh <- ログとして保存するスクリプト | |-- data | |-- pfrproc2 <- サーバー | | |-- 2018 | | | |-- 02 | | | | |-- 22 | | | | | |-- 20180222000001.log | | | | | | .................. | | | | | |-- 20180222134001.log | .................. | |-- pfrproc4 <- サーバー | | |-- 2018 | | | |-- 02 | | | | |-- 22 | | | | | |-- 20180222000001.log | | | | | | .................. | | | | | |-- 20180222134001.log | .................. }}} == ログ == ログにはヘッダとしてホスト名、psコマンド、日時を付加している。 {{{ # hostname : pfrproc2 # command : ps axwwwo user,pid,ppid,%cpu,%mem,vsz,rss,tname,stat,start_time,bsdtime,args # date : 2018/02/22 14:00:01 USER PID PPID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0 0.0 0.0 33664 1236 ? Ss 2017 0:01 /sbin/init root 2 0 0.0 0.0 0 0 ? S 2017 0:00 [kthreadd] root 3 2 0.0 0.0 0 0 ? S 2017 0:25 [migration/0] root 4 2 0.0 0.0 0 0 ? S 2017 11:58 [ksoftirqd/0] root 5 2 0.0 0.0 0 0 ? S 2017 0:00 [stopper/0] root 6 2 0.0 0.0 0 0 ? S 2017 0:06 [watchdog/0] root 7 2 0.0 0.0 0 0 ? S 2017 0:04 [migration/1] root 8 2 0.0 0.0 0 0 ? S 2017 0:00 [stopper/1] root 9 2 0.0 0.0 0 0 ? S 2017 2:44 [ksoftirqd/1] root 10 2 0.0 0.0 0 0 ? S 2017 0:07 [watchdog/1] root 11 2 0.0 0.0 0 0 ? S 2017 1:17 [migration/2] root 12 2 0.0 0.0 0 0 ? S 2017 0:00 [stopper/2] root 13 2 0.0 0.0 0 0 ? S 2017 6:29 [ksoftirqd/2] root 14 2 0.0 0.0 0 0 ? S 2017 0:05 [watchdog/2] root 15 2 0.0 0.0 0 0 ? S 2017 0:46 [migration/3] .................. }}} == スクリプト == ディレクトリの設定を変更することによって他の環境でも使用可能。[[br]] cERL/PFではppidも情報として残したいのでpsコマンドを変更している。 {{{ #!/bin/sh #PS_CMD="ps auxwww" PS_CMD="ps axwwwo user,pid,ppid,%cpu,%mem,vsz,rss,tname,stat,start_time,bsdtime,args" <- psコマンド HOST_NAME="`hostname -s`" YEAR="`date +%Y`" MONTH="`date +%m`" DAY="`date +%d`" HOUR="`date +%H`" MIN="`date +%M`" SEC="`date +%S`" BASE_DIR="/pf/archive/OP/ServerProcess/" <- ディレクトリ DATA_DIR="$BASE_DIR/data" LOG_DIR="$DATA_DIR/$HOST_NAME/$YEAR/$MONTH/$DAY" LOG_NAME="$YEAR$MONTH$DAY$HOUR$MIN$SEC.log" LOG_FULL_NAME="$LOG_DIR/$LOG_NAME" #echo "$HOST_NAME" #echo "$YEAR" #echo "$MONTH" #echo "$DAY" #echo "$HOUR" #echo "$MIN" #echo "$SEC" #echo "$BASE_DIR" #echo "$DATA_DIR" #echo "$LOG_DIR" #echo "$LOG_NAME" echo "$LOG_FULL_NAME" if [ ! -e $LOG_DIR ]; then mkdir -p $LOG_DIR fi echo "# hostname : $HOST_NAME" > $LOG_FULL_NAME echo "# command : $PS_CMD" >> $LOG_FULL_NAME echo "# date : $YEAR/$MONTH/$DAY $HOUR:$MIN:$SEC" >> $LOG_FULL_NAME echo "" >> $LOG_FULL_NAME $PS_CMD >> $LOG_FULL_NAME }}}