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


Автор Тема: Как отловить закрытие программы?  (Прочитано 5848 раз)

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

Оффлайн RazrFalcon

  • Автор темы
  • O_o
  • Старожил
  • *
  • Сообщений: 3144
  • Zombie Mod
    • Просмотр профиля
    • Я на GitHub
Как отловить закрытие программы?
« : 23 Февраль 2011, 22:11:45 »
У меня есть прога, написанная мной же, которая висит в трее.
Висит-висит - бах, пропала. Когда - не известно. Почему - не ясно.
Как можно отловить время закрытия, и то что при этом она выводит в консоль, к примеру. Какой то лог сделать.
Gentoo + KDE, Official Windows Hater
Хотите помочь нашей вики: http://help.ubuntu.ru/wiki/fixme

Оффлайн Frankenstein2017

  • Участник
  • *
  • Сообщений: 222
  • Хатуль Мадан
    • Просмотр профиля
Re: Как отловить закрытие программы?
« Ответ #1 : 23 Февраль 2011, 22:26:54 »
Каким путём надо решить? Можно проверять по
ps -A | grep %process_name%Если Lazarus, попробуй поставить обработчик на OnClose/OnCloseQuery.
У б у н т а р и и   в с е х   с т р а н ,   о б ъ е д и н я й т е с ь !

Оффлайн RazrFalcon

  • Автор темы
  • O_o
  • Старожил
  • *
  • Сообщений: 3144
  • Zombie Mod
    • Просмотр профиля
    • Я на GitHub
Re: Как отловить закрытие программы?
« Ответ #2 : 23 Февраль 2011, 22:38:14 »
У меня QT. На closeEvent поставить не проблема. Это даст время.
Но вот как понять причину сбоя? Она же должна что то в консоль выдать, тот же segmantation fault.
Gentoo + KDE, Official Windows Hater
Хотите помочь нашей вики: http://help.ubuntu.ru/wiki/fixme

Оффлайн aliftin

  • Старожил
  • *
  • Сообщений: 1398
    • Просмотр профиля
Re: Как отловить закрытие программы?
« Ответ #3 : 23 Февраль 2011, 22:41:24 »
Напишите просто демон:
while true
do
id=`pidof audacious2`
if [ "$id" = "" ]
then
echo "R.I.P."
sleep 3
else
echo "She is alive!"
sleep 3
fi
done

Вот и узнаете когда программа упала. Запуская программу перенаправляйте вывод в файл.
Если мы не можем до чего то дотянуться, мы виним в этом не свой рост, не отсутствие табуретки, а свою цель.

iks

  • Гость
Re: Как отловить закрытие программы?
« Ответ #4 : 10 Март 2011, 23:33:36 »
Ну или как вариант запустить прогу из терминала, и когда она упадет туда лог ошибки выведется, сам этим иногда пользуюсь

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Как отловить закрытие программы?
« Ответ #5 : 11 Март 2011, 06:01:59 »
Ну запусти её из под watchdog'а примерно такого
#!/bin/sh
FLAG_FILE=my_prog.flag
LOG_FILE=my_prog.log
touch $FLAG_FILE
while [ -f $FLAG_FILE ]; do
    echo "`date` Started" >>$LOG_FILE
    /path/to/my/prog 2>&1 >>$LOG_FILE
    sleep 1
done
при нормальном выходе просто удали файл чтобы watchdog не перезапускал программу
или можно анализировать код выхода из программы. по сегфолту или всяким неправильным выходам он будет отличен от нуля

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: Как отловить закрытие программы?
« Ответ #6 : 11 Март 2011, 08:46:27 »
Общий подход для мониторинга бесконечных программ.
Сделать обертку падающей программы в виде скрипта. Запускать естественно нужно уже скрипт.
В конце можно использовать zenity для окошечного вывода или запись в лог.
ЗЫ. Всегда стараюсь не создавать лишних демонов (сервисов) - их уже и так стало многовато в стандартной Ubuntu.
« Последнее редактирование: 11 Март 2011, 08:50:14 от alexander.pronin »

Оффлайн Lion-Simba

  • Старожил
  • *
  • Сообщений: 1126
    • Просмотр профиля
Re: Как отловить закрытие программы?
« Ответ #7 : 11 Март 2011, 09:08:17 »
У меня есть прога, написанная мной же, которая висит в трее.
Висит-висит - бах, пропала. Когда - не известно. Почему - не ясно.
Как можно отловить время закрытия, и то что при этом она выводит в консоль, к примеру. Какой то лог сделать.
Если был сегфолт, то его можно увидеть в общесистемных логах:
(Нажмите, чтобы показать/скрыть)

А дальше, если это действительно сегфолт, можно включить создание core-файла - снимок памяти процесса непосредственно в момент падения:
ulimit -c 50000
Почитать: http://aplawrence.com/Linux/limit_core_files.html

А потом этот файл можно скормить в gdb и посмотреть стек. Это покажет, в какой именно ветке исполнения программа упала.
Почитать: http://www.ibm.com/developerworks/library/l-gdb/#h5
Оказываю индивидуальную платную техподдержку широкого профиля. Обращаться в ЛС или Jabber.

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: Как отловить закрытие программы?
« Ответ #8 : 11 Март 2011, 19:37:02 »
Лучше -с unlimited
ulimit -c unlimitedА то обидно будет, если дамп порежется.

Чтобы gdb не глюковал с определением строк программы, ее надо предварительно скомпилировать без оптимизации и с полной отладочной информацией в формате gdb
Ключи компилятора:
-O0 -ggdb3
Помимо прочего рекомендую valgrind - это тяжелая артиллерия, способная довольно точно определить утечки памяти и data race.
« Последнее редактирование: 11 Март 2011, 19:40:31 от wl »
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн Goshman

  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
Re: Как отловить закрытие программы?
« Ответ #9 : 12 Март 2011, 09:54:38 »
Добрый день!

Немного не в тему, но все же...

Есть програмка на Qt, которая должна при выходе (выключении компьютера) сохранять данные на диск.
Использую для этого closeEvent(QCloseEvent *event)

Система Ubuntu 10.04. В параметрах управления питанием во вкладке "Общие" при нажатии кнопки питания установил "Завершение работы"
Собствено при нажатии на кнопку Power комп выключается и запись на диск не производится. При простом выходе из програмы все ОК.

Куда копать?

Оффлайн Roger

  • Любитель
  • *
  • Сообщений: 81
    • Просмотр профиля
Re: Как отловить закрытие программы?
« Ответ #10 : 12 Март 2011, 16:51:59 »
Мне кажется это проблема не только вашей программы. Мои наблюдения показали, что скорее всего при "Выключении" система просто делает всем программам kill без разбору.
UNIX прост. Но надо быть гением, чтобы понять его простоту

Оффлайн hippi90

  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
Re: Как отловить закрытие программы?
« Ответ #11 : 12 Март 2011, 17:36:06 »
Добрый день!

Немного не в тему, но все же...

Есть програмка на Qt, которая должна при выходе (выключении компьютера) сохранять данные на диск.
Использую для этого closeEvent(QCloseEvent *event)

Система Ubuntu 10.04. В параметрах управления питанием во вкладке "Общие" при нажатии кнопки питания установил "Завершение работы"
Собствено при нажатии на кнопку Power комп выключается и запись на диск не производится. При простом выходе из програмы все ОК.

Куда копать?
Если мне не изменяет память, при завершении работы ОС отсылает всем процессам SIGTERM, соответственно вам в вашей программе надо его перехватить и обработать.

Оффлайн Lion-Simba

  • Старожил
  • *
  • Сообщений: 1126
    • Просмотр профиля
Re: Как отловить закрытие программы?
« Ответ #12 : 12 Март 2011, 18:05:03 »
Если мне не изменяет память, при завершении работы ОС отсылает всем процессам SIGTERM, соответственно вам в вашей программе надо его перехватить и обработать.
Именно. А через N секунд после TERM всем оставшимся процессам-тормозам отправляется KILL, который, увы и ах, уже не перехватить. N где-то настраивается.
Оказываю индивидуальную платную техподдержку широкого профиля. Обращаться в ЛС или Jabber.

Оффлайн tremor

  • Участник
  • *
  • Сообщений: 212
  • Промышляю локальными сетями
    • Просмотр профиля
    • Компьютерные сети в Екатеринбурге
Re: Как отловить закрытие программы?
« Ответ #13 : 12 Март 2011, 22:25:35 »
Если прога написана вами, то ожнозначно нужно дописать к ней обработчик сигналов (перехватывать сигналы умеет и ьаш и СИ, так что полюбому вам подойдет). Перехватывайте sigkill и sigterm

http://www.linuxquestions.org/questions/programming-9/signal-handling-from-bash-257157/  -- вот написано как это на баше сделать.

Оффлайн Goshman

  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
Re: Как отловить закрытие программы?
« Ответ #14 : 13 Март 2011, 08:27:16 »
Всем спасибо, чуть с делами разгребусь и попробую.
По результатам отпишусь.

 

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