Страница 1 из 1

можно ли убивать сервер, и как это делвать правильно...

Добавлено: 02 мар 2005, 12:09
jake
FB 1.5 CS под Linux.
Подскажите, как классик реагирует на его убийство сигналом TERM?
т.е. можно ли делать так: kill <fb-pid> или killall fb_inet_server?

Корректно ли завершать клиентский процесс таким образом? Не может ли это вызвать повреждения базы?

спасибо.

Добавлено: 02 мар 2005, 12:14
jake
тьфу. не "клиентский процесс" конечно... :) имел ввиду процесс сервера, обслуживающий конкретный клиентский коннект.

то же самое насчет Супера. можно ли с ним так поступать?

Добавлено: 02 мар 2005, 12:45
kdv
в общем случае - нет. клиентский процесс, а тем более супер, может в это время заниматься записью данных на диск, а еще хуже - сборкой мусора. Это насчет терминирования. а вот как оно обрабатывает сигналы типа wm_quit или остановку сервиса - честно говоря, не знаю. вполне возможно что так же.

Добавлено: 02 мар 2005, 13:50
jake
kdv писал(а):в общем случае - нет. клиентский процесс, а тем более супер, может в это время заниматься записью данных на диск, а еще хуже - сборкой мусора.
Насколько я знаю, обычно приложения в юникс совершенно нормально относятся к их завершению сигналом 15 (TERM). При этом большинство из них завершают работу абсолютно корректно (в отличие например от убиства 9-м сигналом). Т.е. TERM обычно воспринимается как: "доделать недоделанное и завершить работу". Так что и FB может к примеру дособирать мусор (если действительно этот процесс нельзя останавливать посередине) и завершиться...

Чаще всего можно найти (в тех же man) как приложение реагирует на тот или иной сигнал.
В доке firebird ничего не нашел по этому поводу, так что остаётся только догадываться

Добавлено: 02 мар 2005, 14:28
Merlin
jake писал(а): Насколько я знаю, обычно приложения в юникс совершенно нормально относятся к их завершению сигналом 15 (TERM).
С FB на боевой базе даже не пытаюсь, на девелоперских проблем пока не было, но там и нагрузка и замусоренность близка к нулю. А вот с IB4 имел из-за этого повреждения базы в среднем раз в 8 месяцев. Под этим антиквариатом у меня бакапы были нересторабельны и ночной крон вырубал забывших запущенную задачу пользователей и осуществлял файловое копирование.

Добавлено: 03 мар 2005, 14:48
DSKalugin
убивать таким образом нельзя
надо использовать готовые функции управления сервисом
service firebird stop/start/restart или reload
это может быть по разному на разных линуксах

на старой шапке у меня работало
service gds_db stop
на сусях /etc/init.d/firebird stop

но не килом

Добавлено: 04 мар 2005, 13:13
dimitr
Сервер не содержит обработчика SIGTERM, поэтому случиться может все, что угодно.

Добавлено: 09 мар 2005, 10:23
jake
dimitr писал(а):Сервер не содержит обработчика SIGTERM, поэтому случиться может все, что угодно.
Спасибо. понятно.

Как тогда правильно остановить все процессы классика? Ведь остановка xinetd (/etc/init.d/xinetd stop) не завершает уже запущенные fb_inet_server...

/opt/firebird/bin/gfix -shut -force 0 <my_db>
так правильно?
что произойдет в случае такого шатдауна с процессом, занятым сборкой мусора?
Мне просто нужно корректно и без вопросов остановить классик.

Добавлено: 09 мар 2005, 11:06
jake
dimitr писал(а):Сервер не содержит обработчика SIGTERM, поэтому случиться может все, что угодно.
Не считаете ли вы, что такой обработчик необходим?
Допустим я завершаю работу сервера (init 0, poweroff, как угодно). Получается так, что работающие процессы классика никто корректно не остановит, и они будут именно убиты и, "случиться может всё, что угодно".
Вот что я нашел в скриптах своей системы (/etc/init.d/halt):

Код: Выделить всё

action "Sending all processes the TERM signal..." /sbin/killall5 -15
sleep 5
action "Sending all processes the KILL signal..."  /sbin/killall5 -9
Все процессы, не завершенные соответствующими скриптами запуска/останова просто убиваются. сначала по SIGTERM, потом по SIGKILL...
Т.е. даже в случае корректного завершения работы системы, база может оказаться поврежденной :-(

Я так понимаю, либо надо обработчик этот в самом сервере , либо в классике тоже делать скрипт /etc/init.d/firebird, который по stop будет делать что-то вроде gfix -shut ? либо и то и другое вместе?

спасибо.

Добавлено: 11 мар 2005, 12:00
dimitr
jake писал(а):Как тогда правильно остановить все процессы классика? Ведь остановка xinetd (/etc/init.d/xinetd stop) не завершает уже запущенные fb_inet_server...

/opt/firebird/bin/gfix -shut -force 0 <my_db>
так правильно?
Да. Полный шатдаун и после его завершения отстрел всех процессов классика. Сборка мусора будет остановлена шатдауном.

Добавлено: 11 мар 2005, 12:03
dimitr
jake писал(а):Не считаете ли вы, что такой обработчик необходим?
Допустим я завершаю работу сервера (init 0, poweroff, как угодно). Получается так, что работающие процессы классика никто корректно не остановит, и они будут именно убиты и, "случиться может всё, что угодно".
Считаю, что необходим. Но больше для порядка/удобства, чем для целостности базы. Ибо она никогда не должна портиться при убитии сервера. То, что сейчас изредка наблюдается, я считаю багом, который рано или поздно будет изничтожен.

Добавлено: 11 мар 2005, 12:13
jake
>dimitr
Спасибо за разъяснения.