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


Автор Тема: Как правильно останавливать сервис (демон)?  (Прочитано 640 раз)

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

Оффлайн Master_Sergius

  • Автор темы
  • Активист
  • *
  • Сообщений: 528
  • i3
    • Просмотр профиля
Имеется программный продукт (назовем его bender) и init-скрипт. Если выполнить:
sudo service bender stop, то немедленно появляется сообщение, что мол сервис остановлен. Но, созданные им подпроцессы хоть и получают команду остановиться всё ещё живут, пока не доделают свою работу (идет закачка файлов).
И вот, собственно, вопрос - какой подход будет более правильный:
1) убивать те подпроцессы немедленно, не дав им доработать
2) допилить init-скрипт, чтобы он показывал, что сервис остановлен лишь тогда, когда он действительно остановлен (все процессы закончили своё дело), естественно с некоторым таймаутом, к примеру 60 секунд?
Мой блог о семействе *nix: http://nixtravelling.blogspot.com/

Оффлайн spk-ubuntu

  • Активист
  • *
  • Сообщений: 502
    • Просмотр профиля
Re: Как правильно останавливать сервис (демон)?
« Ответ #1 : 16 Октября 2015, 00:14:10 »
или 3) оставить как есть - не заставлять ждать 60 сек и дать процессам доработать.
а может 4) допилить bender так чтобы при получении сигнала они ничего "не доделывали", а всё-таки завершались (возможно, сохранив свое состояние)?
По-моему, единственного "правильного" варианта быть не может - всё определяется спецификой решаемой задачи.

Оффлайн ALiEN175

  • Администратор
  • Старожил
  • *
  • Сообщений: 6275
  • Vamos a Bailar
    • Просмотр профиля
Re: Как правильно останавливать сервис (демон)?
« Ответ #2 : 16 Октября 2015, 01:12:55 »
Цитировать
созданные им подпроцессы хоть и получают команду остановиться всё ещё живут, пока не доделают свою работу (идет закачка файлов).

все логично, или я неправ?
допустим, сервис копирует файл - при остановке сервиса мы должны сразу убить 'cp', неважно, какую важную инфу он там копирует, или всё-таки дать спокойно выполнить задачу?
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн Master_Sergius

  • Автор темы
  • Активист
  • *
  • Сообщений: 528
  • i3
    • Просмотр профиля
Re: Как правильно останавливать сервис (демон)?
« Ответ #3 : 16 Октября 2015, 16:53:20 »
Спасибо, господа. И всё же, может где-то есть что-то вроде "best practices", разные примеры и т.п.? Главный фокус в том, что как раз то спецификации по этому поводу нет никакой. Дать просто доработать - вроде и хорошо, но в особенно тяжелых случаях это может длиться довольно долго.
Мой блог о семействе *nix: http://nixtravelling.blogspot.com/

Оффлайн spk-ubuntu

  • Активист
  • *
  • Сообщений: 502
    • Просмотр профиля
Re: Как правильно останавливать сервис (демон)?
« Ответ #4 : 16 Октября 2015, 22:35:42 »
Настолько я понял, речь идёт о каком-то менеджере закачек. Такие демоны как transmission-deamon и eiskaltdcpp-daemon при остановке сохраняют свое состояние и прерывают закачки. Имхо это оптимальное поведение.
Если реализовать такой вариант затруднительно, то исходите из Ваших личных предпочтений (если делаете для себя) или из ожиданий пользователей (если делаете для кого-то).




Оффлайн Master_Sergius

  • Автор темы
  • Активист
  • *
  • Сообщений: 528
  • i3
    • Просмотр профиля
Re: Как правильно останавливать сервис (демон)?
« Ответ #5 : 17 Октября 2015, 22:31:10 »
1) закачки выполняются по протоколу http, используя python.urllib, сомневаюсь, что можно выполнить "дозакачку"
2) сама программа не моя, и довольно сложная структура, мне надо лишь пофиксить баги, вряд-ли смогу переписать её по-другому
Мой блог о семействе *nix: http://nixtravelling.blogspot.com/

Оффлайн spk-ubuntu

  • Активист
  • *
  • Сообщений: 502
    • Просмотр профиля
Re: Как правильно останавливать сервис (демон)?
« Ответ #6 : 18 Октября 2015, 00:22:39 »
ну тогда лично мне ближе
Цитировать
1) убивать те подпроцессы немедленно, не дав им
доработать
раз доктор сказал в морг - значит в морг админ сказал stop - значит стоп. в конце концов как часто этот stop будет вызываться? в основном при перезагрузке/выключении? ну так тут если их не пристрелите Вы, то пристрелит ось (а если вдруг не пристрелит, то вместо перезагрузки будете ждать окончания всех закачек, что мягко говоря не лёд).
теоретически можно каждый подпроцесс заставить прикидывать время, требуемое для завершения закачки, и если оно в пределах скажем 5 сек, то давать ему эти 5 секунд доработать. успел - молодец, не успел - ничего личного, только бизнес. но это усложнит систему. надо ли оно - зависит от специфики решаемой задачи.

 

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