Как остановить службу с помощью манифеста 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 следует попытаться

Другие вопросы по тегам