Как остановить службу с помощью манифеста SMF Solaris / illumos / OpenIndiana?
Я пишу файл конфигурации SMF для SmartD, и я вижу в различных примерах, что у меня есть два варианта: использование файлов PID, как (из apcupsd)
echo "Stopping apcupsd power management ...\c"
if [ -f ${APCPID} ]; then
THEPID=`cat ${APCPID}`
kill ${THEPID} || return=" Failed."
rm -f ${APCPID}
else
return=" Failed."
fi
rm -f ${LOCKDIR}/apcupsd
echo "$return"
или просто пропустить метод stop, например, с помощью этого SMF-генератора, не предоставляя сценария остановки, кроме минимальной команды ":kill".
В обоих случаях похоже, что сервис убит. Тогда зачем использовать метод остановки?
В моем конкретном случае SmartD работает по умолчанию без PID, но у меня есть возможность изменить поведение.
1 ответ
В команде метода SMF :kill
просто означает.... ну только это. Тот же эффект, что и при выполнении kill
Команда из оболочки, кроме SMF, удостоверяется, что это контракт, который уничтожен, то есть все процессы контракта умирают.
Вы можете прочитать о :kill
на странице руководства для "smf_method"
Если вы не укажете
<exec_method type='method' name='stop' ..../>
вообще в вашем манифесте тогда SMF будет использовать :kill -SIGTERM
как команда остановки. Это работает для многих услуг. Очень часто у вас может быть очень простой манифест SMF, который не требует много строк.
Однако в некоторых случаях вам может потребоваться более сложный метод stop, и в этом случае вам придется кодировать свой собственный. Ваш не такой случай. Ваш пример просто использует kill
так что он ничего не делает, чем SMF не сделал бы сам по себе. Вам это не нужно!
Некоторые примеры приходят на ум из сценариев, где многие хотят использовать явный метод "стоп":
Служба имеет собственный скрипт запуска / остановки / перезапуска. В этом случае лучше использовать это, если вы не понимаете, что то, что он делает, тривиально и может также быть обработано SMF.
У сервиса есть альтернативный метод выключения, который позволяет ему корректно завершить работу. Например, Tomcat открывает прослушивающий порт на локальном хосте, и когда вы отправляете текст "SHUTDOWN" на этот порт, Tomcat корректно завершает работу.
Служба не всегда может реагировать на команду kill. Может потребоваться более жесткий метод, такой как первое выполнение
kill
(приятно убить), и если это не убило процесс через X секунд, тоkill -9
следует попытаться