Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Запуск программы после сетевого интерфейса  (Прочитано 23324 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Serguntii
Помогающий

ru
Offline Offline

« : 21-03-2014 14:35 » 

Нужно запускать программу после того как будет настроена сеть. Сейчас запускаю таким скриптом:
Код:
[Unit]
Description=Programm start count.....
After=local-fs.target network.target

[Service]
Type=oneshot # is forking instead of oneshot needed here?
ExecStart=/home/module_counter/module_counter
TimeoutSec=0
#StandardInput=tty
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
Все работает, но иногда программа зависает, ее нужно перезапустить.
Как бы сделать проверку на зависание и если программа заисла ее перезапустить?
Записан
Serguntii
Помогающий

ru
Offline Offline

« Ответ #1 : 21-03-2014 15:38 » 

Это возможно сделать? Где можно про это прочитать, буду очень благодарен за советы.
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 21-03-2014 15:55 » 

Как определить, что программа зависла?
http://habrahabr.ru/post/27730/
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Serguntii
Помогающий

ru
Offline Offline

« Ответ #3 : 21-03-2014 16:36 » 

Отлично то что нужно, так понимаю нужно только добавить в /run/   module_counter
а там где запускаю сервисе
PIDFile=/run/module_conter
ExecStart=/home/module_counter
потом добавить скрипт который будет проверять /run/module_counter
Правильно я понимаю?
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 21-03-2014 16:46 » 

разжевать и в рот положить?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Serguntii
Помогающий

ru
Offline Offline

« Ответ #5 : 21-03-2014 16:52 » 

Нет не надо я сам,думаю в правильном направление ?
Записан
Serguntii
Помогающий

ru
Offline Offline

« Ответ #6 : 21-03-2014 17:20 » 

Не совсем понимаю что должно создавать pid файл сама программа или это делается скриптом, но ведь если программа уже запущена у нее есть pid. Сорри за ламерские вопросы.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #7 : 21-03-2014 17:25 » 

*nix файловая система, это не только то что есть на диске. Например ядро также проецирует в файловую систему переменные. Это так для размышления.

Но в данному случае .pid файлы насколько я помню пишутся скриптом. Сейчас надо будет глянуть.
« Последнее редактирование: 21-03-2014 17:31 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Serguntii
Помогающий

ru
Offline Offline

« Ответ #8 : 21-03-2014 17:32 » 

Ничего не понимаю (
Нужно добавить в программу код который будет создавать /var/run/myprog.pid
вот нашел пример создания pidfile  http://unixfaq.ru/index.pl?req=qs&id=523
Или его как-то скриптом можно создавать как правильно ?
Записан
Serguntii
Помогающий

ru
Offline Offline

« Ответ #9 : 21-03-2014 18:10 » 

Если мы создадим pidfile в самой программе, а скрипт будет проверять через интервалы pidfile  но так можно проверить запускался ли сервис? а если он завис pidfile не удалится сам или я ошибаюсь?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #10 : 21-03-2014 18:32 » 

sergeyan, Какие критерии, что сервис подвис?
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Serguntii
Помогающий

ru
Offline Offline

« Ответ #11 : 21-03-2014 18:46 » 

Зависает скорее всего из а того что не хватает памяти озу, если если его перезапустить в течение 1 минуты то это не на что не повлияет.
Записан
Serguntii
Помогающий

ru
Offline Offline

« Ответ #12 : 22-03-2014 08:10 » 

Скорее всего я не правильно что то настроил с линуксом не особо долго занимаюсь, подскажите алгоритм как действовать что бы сэкономить память?

* памятимало.jpg (142.4 Кб - загружено 1390 раз.)
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #13 : 22-03-2014 08:39 » 

Если при new  в с++ не хватает памяти, должно по стандарту выскочить исключение. Это правило вроде ввели в стандарте 99 года. Следовательно твоя программа должна посыпаться. Но проверку на NULL никто не отменял.
Сей агрегат для чего предназначин? Если как сервер, тогда для чего ему графика? Ее можно отключить как класс. Не обрашай внимание на пункты buffer и cache. Они по мере надобности будут системой освобождаться автоматически. Можно сделать своп, тогда долгоживушие и долго не используемые станици ядро будет сбрасывать в своп, тем самым освобождая память. Убрать из загрузки не нужные демоны.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Serguntii
Помогающий

ru
Offline Offline

« Ответ #14 : 22-03-2014 09:05 » 

Это простенький веб сервер, но находится он можно сказать у черта на куличках, если зависает нужно пройти больше 1км что бы добраться до этого блока и нажать ресет.  Графики в этом блоке нет, это окно виртуальной машины на моем пк, а терминал подключен через  два провода rx tx (rs232) к этому блоку.  Не понимаю почему памяти 52535 а использовано 51176  свободно 1356 однако нет таких процессов или они не помещаются в окно которые расходовали бы такой объем памяти.  По поводу зависания кажется причину нашел, мой процесс вначале нагружал процессор практически на 90% наверно из за этого вылетал ,в цикле добавил немного usleep процесс перестал так сильно грузить, на этой картинке уже 4,2. Но все же хочется разобраться куда девается память и сделать ему скрипт который бы следил за зависанием.  в программу module_counter добавил код который создает /run/module_counter/counter.pid файл с номером PID. А  как добавить swop , можно это сделать уже на рабочей системе?     
Записан
Serguntii
Помогающий

ru
Offline Offline

« Ответ #15 : 22-03-2014 09:47 » 

По зависание вроде придумал как сделать: программа module_counter постоянно (в цикле) создает файл /run/module_counter/counter.pid с своим pid номером.
Нужно сделать скрипт который будет запускаться по времени с интервалом 1минута
1) проверять есть ли  файл /run/module_counter/counter.pi
2) проверять запущен ли процесс с таким pid
3)Если хоть одна ложь перезапустить службу systemctl stop module_counter    .. systemctl start module_counter
4)удалить файл counter.pid из /run/module_counter/
Помогите сделать скрипт я в них не очень соображаю, проще думаю еще одну службу сделать которая бы делала то что делает скрипт. но что то подсказывает что это не айс будет (

Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #16 : 22-03-2014 09:55 » 

Есть такая программа valgrind. Попробуй через нее пропустить свой сервис. Она покажет, есть ли течи памяти, или их нету.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #17 : 22-03-2014 10:19 » 

Скрипт делатеся банально.
Что то типа этого
Код: (Bash)
#!/bin/bash

FILE=/run/module_counter/counter.pid

if [ -f $FILE ]; then
   PID=$(cat $FILE);
   ps --pid $PID >/dev/null;
   if [ $? -ne 0 ]; then
      rm $FILE;
      systemctl stop module_counter;
      systemctl start module_counter;
   fi
else
      systemctl stop module_counter;
      systemctl start module_counter;
fi

Сажаеш на crontab или at и будет тебе 1 минутная задержка.
« Последнее редактирование: 22-03-2014 10:24 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Serguntii
Помогающий

ru
Offline Offline

« Ответ #18 : 22-03-2014 10:40 » 

Спасибо сейчас попробую, вроде понял как работает,вот тут немного не понятно if [ $? -ne 0 ]; then как это работает?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #19 : 22-03-2014 10:54 » 

$? переменная, которая хранит результат работы последней программы, т.е. ps
Все остальное смотри man test. Квадратные скобки интепретируются именно в команду test. Пробелы между скобками и условием обязательны. Иначе работать не будет.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Serguntii
Помогающий

ru
Offline Offline

« Ответ #20 : 22-03-2014 12:03 » 

Понятно все работает). По  cromtab для того что бы запускать скрипт который вы показали каждую минуту, добавил в папку(достаточно ли его только добавить или нужно где то прописать) /etc/cron.d файл oneminute в него добавил код  :

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
*/1 * * * * root run-parts /home/module_counter/watcdog
Но скрипт не запускается каждую минуту.
права на watcdog chmod u+x  . Скрипт работает если его запустить ./watchdog

« Последнее редактирование: 22-03-2014 12:23 от sergeyan » Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #21 : 22-03-2014 13:11 » 

мало отредактировать файл crontab

Я бы мог сказать, что делать
Но ты должен понимать что ты делаешь

Тебе нужно отредактировать crontab так, чтобы демон cron'а его подхватил
man crontab

Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Serguntii
Помогающий

ru
Offline Offline

« Ответ #22 : 22-03-2014 13:15 » new

Все работает. )) редактировать нужно было crontab -e  и запустить службу нужно было в systemctl start croni
Теперь все работает как и должно. Спасибо за помощь.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines