Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Помогите написать СКРИПТ .  (Прочитано 2043 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн dmsergei

  • Автор темы
  • Новичок
  • *
  • Сообщений: 47
    • Просмотр профиля
Помогите написать СКРИПТ .
« : 16 Декабря 2008, 23:18:23 »
Вообщем задача такая :

нужно каждую минуту проверять запущен ли процесс скажем -- PROC1
Если вдруг он не запущен нужно делать killall proc2
И потом запустить PROC1 и proc2
И опять всё покругу.

Сам не могу написать --НЕхватает ума  :-\ :-[

Оффлайн Alsvartr

  • Активист
  • *
  • Сообщений: 779
  • The secret of the secret
    • Просмотр профиля
Re: Помогите написать СКРИПТ .
« Ответ #1 : 16 Декабря 2008, 23:26:50 »
Можно сделать что-то типа этого:
for ((a=1; a <= 1000 ; a++))
 do
  echo "Attempt №$a"
  killall PROC2
  PROC2 &
  PROC1
 done

Ну и, соответственно, запускать PROC1 только через этот скрипт. В этом случае, когда PROC1 помрет, то скрипт прогонит цикл снова.

tartan

  • Гость
Re: Помогите написать СКРИПТ .
« Ответ #2 : 16 Декабря 2008, 23:31:08 »
#!/bin/bash
PROCESSALIVE=$(top -n 1 | grep -c process1)
if  [ "PROCESSALIVE" = 1 ]
then
exit 0
else
killall process1
process2 &
process1
fi
exit 0

И в крон с нужной периодичностью.

Примерно так должно быть.

список литературы:
man grep
man top
Тема "Пишем bash-скрипты"


Оффлайн dmsergei

  • Автор темы
  • Новичок
  • *
  • Сообщений: 47
    • Просмотр профиля
Re: Помогите написать СКРИПТ .
« Ответ #3 : 16 Декабря 2008, 23:41:00 »
#!/bin/bash
PROCESSALIVE=$(top -n 1 | grep -c process1)
if  [ "PROCESSALIVE" = 1 ]
then
exit 0
else
killall process1
process2 &
process1
fi
exit 0

И в крон с нужной периодичностью.

Примерно так должно быть.

список литературы:
man grep
man top
Тема "Пишем bash-скрипты"



СПАСИБО наверное это то что нужно!
Про TOP знал
а про grep - буду изучать
Тема "Пишем bash-скрипты" - не нашёл поэтому кинул сюда --ИЗВЕНИТЕ

Alsvartr - тоже спасибо

Оффлайн dmsergei

  • Автор темы
  • Новичок
  • *
  • Сообщений: 47
    • Просмотр профиля
Re: Помогите написать СКРИПТ .
« Ответ #4 : 17 Декабря 2008, 01:33:05 »
#!/bin/bash
PROCESSALIVE=$(top -n 1 | grep -c process1)
if  [ "PROCESSALIVE" = 1 ]
then
exit 0
else
killall process1
process2 &
process1
fi
exit 0

И в крон с нужной периодичностью.

Примерно так должно быть.

список литературы:
man grep
man top
Тема "Пишем bash-скрипты"



При не выполненом условии пишет :

line12:exit: слишком много аргументов   


И ещё если мне надо проверять чтобы процессов было не меннее 1 и не более 10 -- то как должно быть
Пробовал:
if  [ "PROCESSALIVE" > 1 ]  - выдаёт ошибку нет такого файла ???
« Последнее редактирование: 17 Декабря 2008, 01:36:55 от dmsergei »

tartan

  • Гость
Re: Помогите написать СКРИПТ .
« Ответ #5 : 17 Декабря 2008, 02:40:12 »
Гммм. Ламер я ламер...

Вот так должно работать:

#!/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 сделать то, что в лого называется рекурсивной процедурой?
« Последнее редактирование: 17 Декабря 2008, 02:56:09 от tartan »

Оффлайн dmsergei

  • Автор темы
  • Новичок
  • *
  • Сообщений: 47
    • Просмотр профиля
Re: Помогите написать СКРИПТ .
« Ответ #6 : 17 Декабря 2008, 09:51:28 »
tartan - спасибо буду пробовать!

Я в top сделал так :

top -b -n 1 -u username

И у меня выводмт все запущенные процессы "username"- тоже вроде работает.

Оффлайн vrybas

  • Активист
  • *
  • Сообщений: 505
    • Просмотр профиля
Re: Помогите написать СКРИПТ .
« Ответ #7 : 17 Декабря 2008, 10:41:23 »
Я так запускаю stardict на хоткей, чтобы он не плодил иконки в трее

$ killall stardict || stardict (на всякий случай убиваю и, при любом результате, запускаю снова. Но приходится два раза нажмать если все-таки он запущен)

Вобщем поиграйся с операциями
"||" - или,
"&&" - и


« Последнее редактирование: 17 Декабря 2008, 10:46:21 от vrybas »

Оффлайн dmsergei

  • Автор темы
  • Новичок
  • *
  • Сообщений: 47
    • Просмотр профиля
Re: Помогите написать СКРИПТ .
« Ответ #8 : 17 Декабря 2008, 16:22:54 »
Всем спасибо скрипт заработал!
Нооо только из терминала -- через КРОН не хочет останавливаеться на половине запуска проги ???? :'(
Читал тут на форуме - что у крона не хватает буфера ???

У меня такой вопрос -- как поставить задержку в скрипте 30 сек и зациклить это дело ????
« Последнее редактирование: 17 Декабря 2008, 16:34:59 от dmsergei »

Оффлайн sht0rm

  • Старожил
  • *
  • Сообщений: 3397
    • Просмотр профиля
Re: Помогите написать СКРИПТ .
« Ответ #9 : 17 Декабря 2008, 17:15:10 »
sleep 30 ?

Оффлайн dmsergei

  • Автор темы
  • Новичок
  • *
  • Сообщений: 47
    • Просмотр профиля
Re: Помогите написать СКРИПТ .
« Ответ #10 : 17 Декабря 2008, 17:25:01 »
sleep 30 ?

Спасибо а как зациклить :
#!/bin/bash
PROCESSALIVE=$(top -b -n 1 -u username | grep -c proc1)
if  [ 10 -le $PROCESSALIVE  ]
then
   killall proc2
   killall proc1
   echo proc1 big 10
   proc2 &
   proc1
else
if [ $PROCESSALIVE = 0 ]
then
   echo proc1 noo
    killall proc2
    proc2 &
    proc1
else
#echo proc1 population is okay
exit 0
fi
fi

Оффлайн vrybas

  • Активист
  • *
  • Сообщений: 505
    • Просмотр профиля
Re: Помогите написать СКРИПТ .
« Ответ #11 : 18 Декабря 2008, 05:30:29 »
Можно так:
while true
do
  echo "бесконечный цикл"
done

Но это не труЪ. Тут надо полноценного демона писать. А я сомневаюсь что демоны через while true работают. Самому кстати интересно.

Оффлайн dmsergei

  • Автор темы
  • Новичок
  • *
  • Сообщений: 47
    • Просмотр профиля
Re: Помогите написать СКРИПТ .
« Ответ #12 : 18 Декабря 2008, 10:50:49 »
Вот что получилось -- посмотрите
вроде работает -- но всётаки прошу прокомментировать :

#!/bin/bash
while true; do
PROCESSALIVE=$(top -b -n 1 -u username | grep -c proc1)
if  [ 10 -le $PROCESSALIVE  ]
then
   echo proc1 big 10
   killall proc2
   killall proc1
   sleep 5
   proc1 &
  proc2
else
if [ $PROCESSALIVE = 0 ]
then
   echo proc1 noo
    killall proc2
sleep 5
    proc1 &
    proc2
else
echo proc1 population is okay
fi
fi
sleep 30
done

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: Помогите написать СКРИПТ .
« Ответ #13 : 18 Декабря 2008, 19:01:54 »
Если proc1 не запускается, proc2 должен работать?
Можно две команды
proc1 &
proc2

заменить на одну
proc1& && proc2

В таком случае proc2 будет запущен только если успешно стартовал proc1
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн dmsergei

  • Автор темы
  • Новичок
  • *
  • Сообщений: 47
    • Просмотр профиля
Re: Помогите написать СКРИПТ .
« Ответ #14 : 18 Декабря 2008, 23:07:19 »
Если proc1 не запускается, proc2 должен работать?
Можно две команды
proc1 &
proc2

заменить на одну
proc1& && proc2

В таком случае proc2 будет запущен только если успешно стартовал proc1

Пишет ошибка синтаксиса  :(

 

Страница сгенерирована за 0.017 секунд. Запросов: 19.