Консультация № 186328
06.06.2012, 16:52
549.74 руб.
0 1 0
Здравствуйте, уважаемые эксперты. У меня возникли сложности с написанием shell-процедуры и мне необходима Ваша процессиональная помощь.
Задание гласит следующим образом:
"Необходимо написать shell-процедуру, которая выполняет следующие действия: всем пользователям, у которых есть больше n приостановленных процессов, отправляется на терминал предупредительное сообщение; если пользователь, получивший предупредительное сообщение в течении m минут не ответит и не уменьшит число приостановленных процессов, то его имя записывается в заданный файл (величины n и m передаются в качестве параметров)."
Дополнительно хочу добавить, что n заранее принимает значение 2, а m 30 (секунд), а также возможно изменение в режиме редактирования shell-процедуры, чтобы n можно было вручную изменить редактируя shell-процедуру на любое значение по усмотрению пользователя. Желательно добавить комментарии в ключевые моменты shell-процедуры (в смысле в сам код добавить, чтобы более конструктивно и понятнее он воспринимался).

Обсуждение

Неизвестный
11.06.2012, 01:41
общий
Код:

#!/bin/sh

N=2
M=30
DATABASE=/tmp/user_stopped_proc.txt

# Процедура нахождения пользователей у которых
# больше N приостановленых процессов.
# Используется в процедуре check_user_stopped_proc
get_user_stopped_proc() {
ps aux | awk '
NR == 1{next}

# признак приостановленного процесса, T в 8-й колонке ps. man ps
$8 ~ /T/ {
s[$1]++;
}

END {
for (i in s)
if (s[i] > '"$1"')
print i
}'
}

# Процедура проверки пользователей, ожидания реакции и записи в файл
check_user_stopped_proc () {

# Отправляем предупреждение найденым пользователям
NAMES="$(get_user_stopped_proc $1)"
for NAME in $NAMES; do
echo "You have too many stopped programs. Maximum $1. Reduce number of programs please" | write "$NAME"
done

# Ожидаем реакции
sleep $2

for NAME in $(get_user_stopped_proc $1); do
# Проверяем что пользователь получил предупреждение в прошлом цикле
if echo "$NAMES" | grep -q "$NAME"; then
echo $NAME >> $DATABASE
fi
done
}

# Запускаем процедуру
check_user_stopped_proc $N $M

Форма ответа