Гммм. Ламер я ламер...
Вот так должно работать:
#!/bin/bash
# Посчитаем процессы. top не годится, потому что пока процесс не хомячит оперативу,
# его не видно. Поэтому - ps -e - отобразить все процессы, пайп и найти все
# процессы с именем pidgin, сосчитать и результат пересчёта сохранить в переменной PROCESSALIVE
PROCESSALIVE=$(ps -e | grep -c pidgin)
# Теперь посмотрим, чтобы не плодились лишние процессы. Вот это: > - перенаправление вывода в
# файл с заданным именем, так что if [ $PROCESSALIVE > 2 ] тупо создаст в папке со скриптом
# пустой файл с именем 2. Пользуемся вот чем: -ge - больше или равно, -gt больше, -le меньше или
# равно, -lt - меньше.
#
# Для отладки я ко всем трём вариантам действий прикрутил echo что-нибудь. Если процессов
# pidgin будет больше двух, скрипт поубивает пиджинов, отрапортует, что это уже не голуби, а
# кролики и запустит вместо двух пиджинов один.
if [ 2 -le $PROCESSALIVE ]
then killall pidgin
echo too many pidgins
pidgin &
# Если количество пиджинов меньше критического, он проверит, есть ли пиджины вообще.
# Если нет, сообщит, что пиджинов чота както маловато и запустит один
else
if [ $PROCESSALIVE = 0 ]
then
echo not enough pidgins
pidgin &
# Если пиджинов не слишком мало и не слишком много, то скрипт сообщит, что всё в поряде и
# завершится.
else
echo pidgin population is okay
exit 0
fi
fi
Теперь где я наврал: два exit - слишком много, ну и процесс не обязательно должен быть один. У меня один запущенный пиджин по ps -e | grep -c pidgin выдаёт 2, а файрфокс - 1.
Короче. Основная идея теперь вроде понятна, вам нужно просто этот скрипт модифицировать.
Вышеприведённый скрипт сто пудов работает. ))
[tartan@crossbow test]$ ~/test/pidcheck <== тут один
pidgin population is okay
[tartan@crossbow test]$ killall pidgin <== тут ни одного
[tartan@crossbow test]$ ~/test/pidcheck <== скрипт запускает одного
not enough pidgins
[tartan@crossbow test]$ pidgin & <== и ещё одного - я
[1] 7959
[tartan@crossbow test]$ ~/test/pidcheck
too many pidgins <== закономерный результат.
Спасибо за интересную, но несложную задачку. ))
А решение Alsvartr надо тоже попробовать.
Кстати. Как в bash сделать то, что в лого называется рекурсивной процедурой?