среда, 7 декабря 2011 г.

Останавливаем сервер или kill -0 $PID

Иногда бывает полезно, а в некоторых случаях нужно, чтобы скрипт старта - остановки сервера не завершался до полной остановки. Например - типичная ситуация, когда сервер работает с локальной базой данных и нам нужен рестарт - а в простейшем случае это совокупность стоп и старт. При медленной остановке сервера, мы получим в данном случае ошибку при старте - база, например, будет заблокирована оостанавливающимся сервером.
В скрипте, всегда, в таком случае, использовал недокументированную в некоторых unix команду:
kill -0 $PID, для проверки существования процесса.
Но недавно нам попался solaris на котором данная команда приводила к core на остановке.
pstack выводил следующее:
ffffffff7b8ca03c sigacthandler (0, ffffffff7ffff150, ffffffff7fffee70, ffffffff7d100200, 0, ffffffff7ba3c000) + 54
 --- called from signal handler with signal 0 (SIGEXIT) ---
 ffffffff7b8da240 __lwp_wait (15, ffffffff7ffff3bc, 0, 0, 0, 0) + 8
что вызывало недоумение, ведь согласно мануалу - такого сигнала в solaris нету.
Переносимое решение пришло такое - вместо kill -0 $PID использовать ps -p $PID, причем, данная команда работает заметно быстрее.
Финальный стоп скрипт такой:
while ps -p $PID 2>&1 >/dev/null
do
 sleep 1
 echo -n .
done 

Комментариев нет:

Отправить комментарий