В качестве языка я выбрал bash, т.к. программы на нём жрут очень мало ресурсов.
Пока делал эту прогу, мне показались интересными три момента:
- Отлавливание сигналов происходит при помощи команды trap
trap "echo Hello world" SIGHUP SIGINT SIGTERM
- Самым надёжным способом выяснить в какой папке лежит сам скрипт является команда lsof
LSOF=$(lsof -p $$ | grep -E "/"$(basename $0)"$")
MY_PATH=$(echo $LSOF\
| sed -r s/'^([^\/]+)\/'/'\/'/1 2>/dev/null)
MY_ROOT=$(dirname $MY_PATH) - Судя по всему самый надёжный способ узнать сколько памяти занимает процесс — это сложить значения 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
Комментариев нет:
Отправить комментарий