среда, 23 февраля 2011 г.

Слежение за процессом из bash скрипта

Я решил поднять у себя на машине самодельный веб-сервер. Естественно хочется чтобы он не мешал во время работы, а так как сервер самодельный риск всяких утечек памяти и зацикливаний высок — нужно средство слежения которое в критический момент будет убивать мою поделку.
В качестве языка я выбрал bash, т.к. программы на нём жрут очень мало ресурсов.

Пока делал эту прогу, мне показались интересными три момента:
  1. Отлавливание сигналов происходит при помощи команды trap
    trap "echo Hello world" SIGHUP SIGINT SIGTERM
  2. Самым надёжным способом выяснить в какой папке лежит сам скрипт является команда lsof
    LSOF=$(lsof -p $$ | grep -E "/"$(basename $0)"$")
    MY_PATH=$(echo $LSOF\
    | sed -r s/'^([^\/]+)\/'/'\/'/1 2>/dev/null)
    MY_ROOT=$(dirname $MY_PATH)
  3. Судя по всему самый надёжный способ узнать сколько памяти занимает процесс — это сложить значения RSS и Dirty команды pmap
    MEMUSE_RAW=$(pmap -x $TARG_PID 2>/dev/null | grep total\
    | sed 's/-//g' | sed s/[^0-9\ ]*//g);
    RSS=$(echo $MEMUSE_RAW | awk '{print $2}')
    DIRTY=$(echo $MEMUSE_RAW | awk '{print $3}')
    MEMUSE=$(echo $RSS+$DIRTY | bc)
Весь код скрипта:


#!/usr/bin/env bash

TARGETNAME=webface

LSOF=$(lsof -p $$ | grep -E "/"$(basename $0)"$")
MY_PATH=$(echo $LSOF | sed -r s/'^([^\/]+)\/'/'\/'/1 2>/dev/null)
MY_ROOT=$(dirname $MY_PATH)

function clean_up {
# Perform program exit housekeeping
echo Killed by signal
kill $TARG_PID
exit
}

trap clean_up SIGHUP SIGINT SIGTERM

echo "$(basename $0) has started with pid $$"
echo "Working dir: $MY_ROOT"

$MY_ROOT/$TARGETNAME &
TARG_PID=$!
echo "Target started with pid $TARG_PID"

while true; do
sleep 5
MEMUSE_RAW=$(pmap -x $TARG_PID 2>/dev/null | grep total | sed 's/-//g' | sed s/[^0-9\ ]*//g);
RSS=$(echo $MEMUSE_RAW | awk '{print $2}')
DIRTY=$(echo $MEMUSE_RAW | awk '{print $3}')
MEMUSE=$(echo $RSS+$DIRTY | bc)

echo $MEMUSE
done

clean_up

Комментариев нет:

Отправить комментарий