Как настроить службу Linux для автоматического запуска после сбоя или перезагрузки - Часть 1. Практические примеры

Вступление

В этом руководстве показано, как настроить системные службы для автоматического перезапуска после сбоя или перезагрузки сервера.

В примере используется MySQL, но вы можете применить эти принципы к другим сервисам, работающим на вашем сервере, таким как Nginx, Apache или к вашему собственному приложению.

В этом руководстве мы рассмотрим три наиболее распространенные системы инициализации, поэтому обязательно следуйте той, которая предназначена для вашего дистрибутива. (Многие дистрибутивы предлагают несколько вариантов или позволяют установить альтернативную систему инициализации.)

  • System V - это более старая система инициализации:

    • Debian 6 и более ранние

    • Ubuntu 9.04 и более ранние

    • CentOS 5 и более ранние

  • Upstart:

    • Ubuntu 9.10 до Ubuntu 14.10, включая Ubuntu 14.04

    • CentOS 6

  • systemd - это система инициализации для самых последних представленных здесь дистрибутивов:

    • Debian 7 и Debian 8

    • Ubuntu 15.04 и новее

    • CentOS 7

Вы также можете проверитьPart 2, the reference article.

Фон

Ваша работающая система Linux или Unix будет иметь несколько фоновых процессов, выполняющихся в любое время. Эти процессы, также известные какservices илиdaemons, могут быть встроены в операционную систему или выполняться как часть приложения.

Примеры служб операционной системы:

  • Демонsshd, разрешающий удаленные подключения

  • Демонcupsd, управляющий печатью

Примеры применения демонов:

  • httpd/apache2 is a web server service

  • mongod - демон базы данных

Предполагается, что эти службы будут работать постоянно, чтобы наши веб-сайты, почта, базы данных и другие приложения работали постоянно.

Как администраторы, мы хотим, чтобы наши сервисы Linux:

  • Работать непрерывно без сбоев

  • Автоматический запуск после перезагрузки или сбоя системы

Однако иногда эти службы отключаются, что делает наши веб-сайты или приложения недоступными.

Перезагрузка может произойти по многим причинам: это может быть плановый перезапуск, последний шаг обновления исправления или результат неожиданного поведения системы. Сбой - это то, что происходит, когда процесс неожиданно останавливается или перестает отвечать на запросы пользователей или приложений.

Цель этой статьи - восстановить работу ваших сервисов даже после сбоя или перезагрузки.

Хотя альтернативы непрерывному мониторингу и предупреждению нет, службы Linux можно сделать в значительной степени самовосстанавливающимися, изменив способ их обработки демонами управления службами, также известными как системыinit.

Единственного способа сделать это не существует: все зависит от конкретного дистрибутива Linux и демона управления службами, который идет с ним. Системы инициализации по умолчанию для многих распространенных операционных систем показаны во введении выше.

[.Примечание]##

Мы более подробно рассмотримrunlevels вPart 2, но в этой статье это поможет понять, что каждая система Linux имеет четыре общих основных уровня запуска:

  • 0 - Уровень запуска 0 означает отключение системы

  • 1 - Уровень запуска 1 означает однопользовательский режим восстановления

  • 5 - Уровень запуска 5 означает многопользовательский, сетевой, графический режим

  • 6 - Уровень запуска 6 для перезагрузки системы

В общем, уровни выполнения 2, 3 и 4 означают состояния, в которых Linux загружался в многопользовательском, сетевом, текстовом режиме.

Когда мы активируем сервис для автоматического запуска, мы фактически добавляем его на уровень выполнения.

цели

В этом уроке из двух частей мы увидим, как настроить службу Linux для автоматического запуска при перезагрузке или сбое системы.

Эта часть серии, часть 1, будет кратким описанием того, как сделать это в трех разных режимах инициализации (инициализации):

  • System V init (также известный как классический init)

  • Выскочка

  • Systemd

ВPart 2 мы объясним, почему мы запускали команды и как они работают за кулисами. Мы поговорим о сценариях запуска, важных файлах и параметрах конфигурации для каждого метода init. Большая часть обсуждения во второй части может показаться теоретической, но послужит полезным справочным материалом для понимания основ.

Часть 1 будет охватывать только практические аспекты настройки автоматического перезапуска.

Предпосылки

Чтобы следовать этому руководству, вам нужно будет создать несколько капель DigitalOcean (или создать свои собственные серверы Linux), каждый с как минимум1 GB ОЗУ. Мы не будем вдаваться в подробности создания капли, но вы можете найти дополнительную информациюhere.

Мы будем использовать разные дистрибутивы для наших примеров.

  • Debian 6 x64 (эта старая ОС необходима для демонстрации системы инициализации System V)

  • Ubuntu 14.04 x64 (для Upstart)

  • CentOS 7 x64 (для systemd)

  • Вы должны настроить пользователя sudo на каждом сервере. Чтобы понять, как работают привилегии sudo, см. Этот DigitalOceantutorial about enabling sudo access

Мы советуем вам сохранить капли после выполнения части 1 этого руководства, поскольку мы будем использовать ту же настройку дляPart 2.

You should not run any commands, queries, or configurations from this tutorial on a production Linux server. Мы собираемся нарушить работу служб в рамках тестирования, и вы не хотите, чтобы ваш действующий сервер завис.

Автозапуск Сервисов с Системой V

Давайте начнем наше обсуждение с System V init, самой старой системой init, обсуждаемой здесь.

  • Debian 6 и более ранние

  • Ubuntu 9.04 и более ранние

  • CentOS 5 и более ранние

В System V для большинства стандартных приложений, которые вы можете установить, таких как Nginx или MySQL, по умолчанию будетstart after reboot, а по умолчанию -NOT start after a crash. Они уже будут поставляться со своими собственными сценариями инициализации в/etc/init.d.

Для пользовательских приложений вам нужно будет создать свои собственные сценарии инициализации и включить автоматический запуск служб.

Создание собственного сценария инициализации выходит за рамки данной статьи, но вы можете сослаться на существующие примеры сценариев, чтобы помочь вам создать свой собственный, если он вам понадобится. Система V использует Bash для сценариев инициализации.

Контрольный список автозапуска для System V

Этот раздел является кратким справочником, чтобы убедиться, что ваш сервис настроен на автоматический запуск.

Контрольный список конфигурации

  • Убедитесь, что у службы есть работающий сценарий инициализации Bash, расположенный в/etc/init.d/service

  • Используйте командуupdate-rc.d, чтобы включить службу (или для системы CentOS,chkconfig):

  sudo update-rc.d service enable
  • Это должно создать символическую ссылку в/etc/rc2.d, которая выглядит следующим образом (создайтеNOT вручную):

  lrwxrwxrwx 1 root root  15 Jul 31 07:09 S02mysql -> ../init.d/service

Обратите внимание, что вы также должны видеть ссылки из каталогов от/etc/rc3.d до/etc/rc5.d; узнайте больше об этих числах, когда мы обсудимrunlevels.

  • Добавьте строкуrespawn для этой службы в конец файла/etc/inittab. Вот общий пример:

/etc/inittab

    id:2345:respawn:/bin/sh /path/to/application/startup
  • Остановите, затем запустите, сервис:

  sudo service service stop
  sudo service service start
  • Перезагрузите сервер.

  sudo reboot

Test

Чтобы проверить, что они работают, вы можете:

  • Перезагрузите сервер, затем убедитесь, что служба работает

  • Поиск номера процесса:

  ps -ef | grep service
  • Убить процесс:

  sudo kill -9 process_number
  • Подождите пять минут, затем убедитесь, что служба снова работает

[[step-1 -—- connected-to-your-debian-6-droplet]] == Шаг 1. Подключение к вашей капле Debian 6

Теперь рассмотрим практический пример использования MySQL.

На панели управления DigitalOcean создайте каплюDebian 6.0 x64 с 1 ГБ ОЗУ.

После инициализации дроплета используйте SSH для подключения к серверу (пользователи Windows могут подключиться с помощью такого инструмента, как PuTTY).

ssh sammy@your_server_ip

В следующих инструкциях мы предполагаем, что ваша учетная запись имеет привилегии sudo.

[[step-2 -—- install-mysql]] == Шаг 2 - Установка MySQL

Мы будем использовать MySQL в качестве нашего тестового сервиса. Выполните следующую команду для установки MySQL Server:

sudo apt-get install mysql-server -y

Появится графический экран, подобный показанному ниже, с просьбой ввести новый пароль root. Представьте, что:

Provide a root password for MySQL

Повторите пароль в следующем приглашении:

Repeat root password at prompt

НажмитеENTER для подтверждения.

Линии будут прокручиваться по мере установки MySQL. После завершения установки выполните следующую команду, чтобы защитить вашу установку:

mysql_secure_installation

Это попросит текущий пароль root. НажмитеN, чтобы сохранить тот же пароль. Затем нажмитеY, чтобы удалить анонимного пользователя, отключить удаленный вход root и удалить тестовую базу данных. Наконец, нажмитеY, чтобы перезагрузить таблицы привилегий.

Наша установка MySQL должна быть завершена.

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

service mysql status

Вывод покажет несколько строк информации, одна из которых покажет, как долго работает служба MySQL (время безотказной работы).

Output/usr/bin/mysqladmin  Ver 8.42 Distrib 5.1.73, for debian-linux-gnu on x86_64

. . .

Uptime:         4 days 18 hours 58 min 27 sec

Threads: 1  Questions: 18  Slow queries: 0  Opens: 15  Flush tables: 1  Open tables: 8  Queries per second avg: 0.0.

[[step-3 -—- configuring-mysql-to-auto-start-after-reboot]] == Шаг 3. Настройка MySQL для автоматического запуска после перезагрузки

По умолчанию MySQL уже настроен на запуск после перезагрузки.

Вы должны увидеть эту символическую ссылку на сценарий инициализации MySQL в каталоге/etc/rc2.d. Обратите внимание, что вам следуетNOT попытаться создать эти символические ссылки вручную; используйте командуupdate-rc.d для включения и отключения служб.

ls -l /etc/rc2.d
Outputlrwxrwxrwx 1 root root  15 Jul 31 07:09 S02mysql -> ../init.d/mysql

Пока есть сценарийS в каталоге уровня запуска по умолчанию для службы, init запустит службу при загрузке сервера.

Итак, MySQL должен быть запущен. Теперь пришло время проверить, будет ли он автоматически запускаться во время загрузки. Перезагрузите компьютер с помощью этой команды:

sudo reboot

Как только сервер снова подключится к сети, подключитесь к нему с помощью SSH.

Снова выполните командуservice mysql status. Опять же, сервис будет показан как работающий. Это означает, что служба автоматически запускается при загрузке операционной системы.

Однако не все услуги будут такими. В этих случаях нам придется вручную настроить службы для автоматического перезапуска. В Debian командаupdate-rc.d позволяет добавлять (или удалять) службы, которые будут автоматически запускаться при загрузке.

Давайте отключим службу MySQL, а затем посмотрим, как включить ее для автоматического запуска. Давайте запустим эту команду, чтобы отключить MySQL:

sudo update-rc.d mysql disable

Чтобы проверить, перезагрузите сервер снова.

sudo reboot

Подключитесь к вашему серверу по SSH.

Попробуйте подключиться к MySQL с помощью клиентского инструмента MySQL:

mysql -u root -p

Вы получите это сообщение:

OutputERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

Повторно включите услугу:

sudo update-rc.d mysql enable

Выход будет:

Outputupdate-rc.d: using dependency based boot sequencing

Если вы используете систему CentOS с System V, команды будут использоватьchkconfig, а неupdate-rc.d.

Обратите внимание, что включение службы для автоматического запуска во время загрузки не запускает ее автоматически, если она остановлена. Чтобы запустить MySQL, запустите эту команду:

sudo service mysql start

[[step-4 -—- configuring-mysql-to-auto-start-after-crash]] == Шаг 4. Настройка MySQL для автоматического запуска после сбоя

Теперь, когда наш сервис снова работает, давайте посмотрим, будет ли он автоматически запускаться после сбоя. В System V по умолчанию автоматически отображаетсяNOT.

Мы будем эмулировать сбой, внезапно завершив процесс. Найдите его идентификатор процесса, выполнив следующую команду:

ps -ef | grep mysql

Вывод будет похож на это:

Outputroot      1167     1  0 07:21 pts/0    00:00:00 /bin/sh /usr/bin/mysqld_safe
mysql     1292  1167  0 07:21 pts/0    00:00:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306
root      1293  1167  0 07:21 pts/0    00:00:00 logger -t mysqld -p daemon.error
root      1384  1123  0 07:21 pts/0    00:00:00 grep mysql

Основными процессами, которые запускают MySQL, являютсяmysqld_safe иmysqld. mysqld_safe - родительский процессmysqld.

В нашем примере мы видим, что они имеют идентификаторы процессов 1167 и 1292 соответственно. Их номера процессов выделены красным цветом выше.

Давайте смоделируем сбой с помощью командыkill -9. Убедитесь, что вы используете свои собственные идентификаторы процессов:

sudo kill -9 1167
sudo kill -9 1292

Проверьте статус услуги:

sudo service mysql status

Вывод покажет, что служба остановлена:

OutputMySQL is stopped..

Теперь, когда наш сервис потерпел крах, как мы поднимаем его? Конечно, мы можем перезапустить его, но это будет ручной процесс; мы хотим, чтобы перезапуск был автоматическим. Чтобы выполнить автоматический перезапуск MySQL после сбоя, мы должны отредактировать файл/etc/inittab.

Мы поговорим о файле/etc/inittab более подробно в части 2, а пока давайте поймем, что это первый файл, который System V читает init при загрузке.

Среди прочего,/etc/inittab решает, как должен вести себя процесс в случае сбоя. Для некоторых процессов это означает, что сервис снова должен появиться. Мы должны убедиться, что MySQL входит в число этих сервисов. Итак, давайте сначала сделаем копию этого:

sudo cp /etc/inittab /etc/inittab.orig

Предупреждение: будьте предельно осторожны при редактировании файла/etc/inittab. Если вы сделаете ошибку в своих командах или удалите любую существующую конфигурацию, система может не загрузиться после перезагрузки.

Откройте/etc/inittab в текстовом редакторе:

sudo nano /etc/inittab

В конце файла добавьте эту строку:

/etc/inittab

ms:2345:respawn:/bin/sh /usr/bin/mysqld_safe

Так что мы здесь делаем?

Что ж, мы помещаем команду в файл/etc/inittab дляrespawn,mysqld_safe process, когда он вылетает. Он имеет четыре поля, каждое из которых отделено двоеточием (:).

  • ms: Первые два символа определяютid для процесса.

  • 2345: Во втором поле указываетсяrunlevels, к которому он должен применяться. В этом случае это для уровней выполнения 2, 3, 4 и 5

  • respawn: В третьем поле указываетсяaction (мы повторно создаем сервис)

  • /bin/sh /usr/bin/mysqld_safe: наконец, четвертое поле - этоprocess (команда для выполнения)

Мы вернемся к файлу/etc/inittab более подробно в части 2 и посмотрим, как он помогает при автоматическом запуске MySQL после сбоя. Пока сохраните файл и выйдите из редактора.

Запустите сервис снова:

sudo service mysql start

Перезагрузите сервер, чтобы изменения вступили в силу:

sudo reboot

Теперь повторите команды, чтобы найти номера процессов, убить процессы и снова проверить статус, начиная сps -ef | grep mysql.

Wait for five minutes или около того, а затем выполните команду:

sudo service mysql status

Вы должны увидеть, что на этот раз MySQL запустился автоматически после сбоя.

Это оно! MySQL теперь автоматически запускается после сбоя службы или перезагрузки системы.

Автозапуск Сервисов с Upstart

Upstart - это еще один метод инициализации, впервые введенный в Ubuntu 6. Это стало по умолчанию в Ubuntu 9.10, а затем было принято в RHEL 6 и его производные. Google Chrome OS также использует Upstart.

  • Ubuntu 9.10 до Ubuntu 14.10, включая Ubuntu 14.04

  • CentOS 6

Несмотря на то, что она работает на текущей версии Ubuntu для LTS (14.04 на момент написания статьи), она постепенно исчезает в пользу systemd, о которой мы расскажем в предыдущем разделе.

Upstart лучше, чем System V, обрабатывает системные службы, и его также легко понять. Однако в этой части руководства мы не будем углубляться в Upstart; в сообществе DigitalOcean естьvery good tutorial on Upstart.

Сегодня мы сконцентрируемся на файлах конфигурации Upstart и узнаем, как их использовать для автоматического запуска сервисов.

Upstart использует файлы конфигурации для управления сервисами. Файлы находятся в каталоге/etc/init. Файлы имеют текстовое содержимое с легко читаемыми разделами, называемымиstanzas. Каждая строфа описывает свой аспект службы и ее поведение.

По умолчанию для большинства стандартных приложений, которые вы можете установить, таких как Nginx или MySQL, по умолчанию используютсяstart after reboot, а такжеstart after a crash, поэтому вам не нужно ничего делать, чтобы это работало. Они уже будут поставляться со своими собственными сценариями инициализации в/etc/init.

Для пользовательских приложений вам придется настроить это самостоятельно. Чтобы узнать, как создать свой собственный сценарий Upstart, прочтитеintroductory Upstart tutorial, упомянутые ранее.

Контрольный список автозапуска для Upstart

Этот раздел является кратким справочником, чтобы убедиться, что ваш сервис настроен на автоматический запуск.

Контрольный список конфигурации

  • Убедитесь, что у службы есть работающий сценарий инициализации Upstart, расположенный в/etc/init/service.conf

    • Файл/etc/init/service.conf должен содержать строку типаstart on runlevel [2345], чтобы включить автоматический запуск после перезагрузки.

    • Файл/etc/init/service.conf также должен содержать строку типаrespawn, чтобы служба могла возродиться после сбоя.

  • Убедитесь, что для службы естьno override file:/etc/init/service.override

(Был бы один, только если вы или другой администратор сделал один ранее)

  • Остановите, затем запустите, сервис:

  sudo initctl stop service
  sudo initctl start service
  • Перезагрузите сервер.

  sudo reboot

Test

Чтобы проверить, что они работают, вы можете:

  • Перезагрузите сервер, затем убедитесь, что служба работает

  • Поиск номера процесса:

  ps -ef | grep service
  • Убить процесс:

  sudo kill -9 process_number
  • В течение нескольких секунд убедитесь, что служба работает

[[step-1 -—- connected-to-your-ubuntu-14-04-droplet]] == Шаг 1. Подключение к вашей капле Ubuntu 14.04

Мы будем использовать сервер Ubuntu 14.04 с MySQL для демонстрации Upstart.

Создайте каплю с 1 ГБ ОЗУ и выберитеUbuntu 14.04 x64 в качестве базового образа.

Подключитесь к серверу с помощью SSH (пользователи Windows могут подключиться с помощью такого инструмента, как PuTTy).

ssh sammy@your_server_ip

В следующих инструкциях мы предполагаем, что ваша учетная запись имеет привилегии sudo.

[[step-2 -—- install-mysql]] == Шаг 2 - Установка MySQL

Теперь мы установим MySQL.

Выполните следующую команду, чтобы обновить список пакетов:

sudo apt-get update

Установите MySQL Server:

sudo apt-get install mysql-server -y

Создайте новый пароль root для MySQL и подтвердите его при появлении запроса.

После завершения установки запустите командуmysql_secure_installation:

mysql_secure_installation

Предоставьте те же ответы на приглашения, которые вы делали при установке в Debian (см. Предыдущий раздел).

[[step-3 -—- configuring-mysql-to-auto-start-after-reboot]] == Шаг 3. Настройка MySQL для автоматического запуска после перезагрузки

По умолчанию MySQL автоматически запускается после перезагрузки. Полезно взглянуть на его конфигурацию, чтобы вы могли настроить свои собственные службы таким образом.

Прежде всего, давайте проверим, запущен ли процесс сервера MySQL:

sudo initctl status mysql

Вы должны увидеть результат примерно так:

Outputmysql start/running, process 2553

Перезагрузите сервер:

sudo reboot

Когда сервер снова подключится, используйте SSH для повторного подключения.

Проверьте статус MySQL:

sudo initctl status mysql

Вывод покажет, что MySQL автоматически запустился. Таким образом, нам не нужно делать что-то конкретное здесь, чтобы включить сервис.

Имейте в виду, что это может быть не так для других демонов приложений, где вам нужно вручную включить службу, создав свой собственный файл Upstart в каталоге/etc/init/.

Кроме того, как Upstart знает, что MySQL должен автоматически запускаться при перезагрузке?

Давайте посмотрим на файл инициализации MySQL Upstart. Откройте файл/etc/init/mysql.conf в текстовом редакторе:

sudo nano /etc/init/mysql.conf

Файл Upstart не является сценарием оболочки, как мы видели на нашей машине Debian.

Файл конфигурации init для MySQL будет содержать блоки сценариев для событий до и после запуска. Эти блоки кода сообщают системе Upstart, что выполнять, когда процесс mysqld запускается или уже запущен.

Давайте внимательнее посмотрим на первые десять строк файла:

/etc/init/mysql.conf

...
description     "MySQL Server"
author          "Mario Limonciello "

start on runlevel [2345]
stop on starting rc RUNLEVEL=[016]

respawn
respawn limit 2 5

Мы видим, что MySQL должен запускаться на уровнях выполнения 2, 3, 4 и 5, и он не должен запускаться на уровнях выполнения 0, 1 и 6.

Здесь мы определяем поведение запуска службы для демона Upstart. В отличие от System V, где мы использовали командыupdate-rc.d илиchkconfig, мы используем файлы конфигурации службы в Upstart. Все, что нам нужно сделать, это добавить / изменить строфуstart. Во второй части мы поиграем с этим файлом и увидим, как включение и отключение службы MySQL влияет на этот файл, и наоборот.

Директивыrespawn перезапускают службу после сбоя, поэтому мы обсудим их на следующем шаге.

[[step-4 -—- configuring-mysql-to-auto-start-after-crash]] == Шаг 4. Настройка MySQL для автоматического запуска после сбоя

У вас все еще должен быть открыт/etc/init/mysql.conf.

Директиваrespawn не требует пояснений: MySQL запустится в случае сбоя. Это уже включено по умолчанию.

Директива после этого более интересна: директиваrespawn limit определяет, сколько раз Linux будет пытаться перезапустить вышедшую из строя службу в интервале, указанном в секундах. В этом случае первый аргумент (2) - это количество попыток, а второй (5) - это интервал. Если служба не запускается (респаун) успешно в течение этого порога, она будет оставаться в остановленном состоянии. Это нормальное поведение по умолчанию, потому что если служба постоянно падает, ее лучше отключить, чем повлиять на стабильность всей системы.

На данный момент выйдите из текстового редактора без внесения каких-либо изменений.

Как мы только что видели, по умолчанию MySQL также настроен на автоматический возврат после сбоя.

Чтобы проверить это, давайте проверим PID службы:

sudo initctl status mysql

Новый PID (после перезагрузки) для нашей системы должен выглядеть следующим образом:

Outputmysql start/running, process 961

Запишите идентификатор процесса для вашего теста. Затем смоделируйте сбой, завершив процесс с помощью командыkill -9, используя свой собственный номер процесса:

sudo kill -9 961

Проверьте статус MySQL сейчас. Он должен быть запущен (немедленно или в течение нескольких секунд) с новым PID:

sudo initctl status mysql

В нашем случае новый PID 1552:

Outputmysql start/running, process 1552

Если вы хотите, вы можете убить его снова. Это будет появляться снова каждый раз:

Это происходит из-за директивыrespawn в файлеmysql.conf.

/etc/init/mysql.conf

respawn

MySQL поставляется с возможностью перезапуска после сбоя по умолчанию, но для других служб вам, возможно, придется добавить эту директиву вручную в файл Upstart. Опять же, во второй части мы увидим, как мы можем изменить поведение при сбое из файла конфигурации.

Автозапуск Сервисов с помощью systemd

systemd - этоsystem and service manager для Linux, который стал де-факто демоном инициализации для большинства новых дистрибутивов Linux.

Впервые реализованная в Fedora, systemd теперь поставляется с RHEL 7 и его производными, такими как CentOS 7. Ubuntu 15.04 также поставляется с родным systemd. Другие дистрибутивы либо включили systemd, либо объявили, что скоро появятся.

  • Debian 7 и Debian 8

  • Ubuntu 15.04

  • CentOS 7

systemd обратно совместим с командами System V и сценариями инициализации.

Это означает, что любая служба System V также будет работать под управлением systemd. Большинство административных команд Upstart и System V были изменены для работы под systemd. Вот почему его часто называютdrop-in replacement для System V init.

С systemd большинство стандартных приложений, которые вы можете установить, например Nginx или MySQL, будут по умолчанию использоватьstart after reboot, а такжеstart after a crash, поэтому вам не нужно ничего делать, чтобы это работало. Они уже будут поставляться со своими собственными сценариями инициализации в/etc/systemd/system.

Для пользовательских приложений вам нужно будет создать свои собственные сценарии инициализации и включить автоматический запуск служб. Мы не будем вдаваться в подробности того, что входит в настраиваемый сценарий инициализации, но вы можете узнать больше о systemd в этомintroductory systemd article.

Контрольный список автозапуска для systemd

Этот раздел является кратким справочником, чтобы убедиться, что ваш сервис настроен на автоматический запуск.

Контрольный список конфигурации

  • Убедитесь, что у службы есть функциональный сценарий инициализации systemd, расположенный в/etc/systemd/system/multi-user.target.wants/service.service

  • Используйте командуsystemctl, чтобы включить службу:

  sudo systemctl enable service.service
  • Это должно создать символическую ссылку в/etc/systemd/system/multi-user.target.wants/, которая выглядит следующим образом (создайтеNOT вручную):

  lrwxrwxrwx 1 root root 38 Aug  1 04:43 /etc/systemd/system/multi-user.target.wants/service.service -> /usr/lib/systemd/system/service.service

Это включит автоматический запуск после перезагрузки.

  • Файл/etc/systemd/system/multi-user.target.wants/service.service также должен содержать строку типаRestart=always в разделе[Service] файла, чтобы служба могла возродиться после сбоя.

  • Перезагрузите демон systemd, а затем перезапустите службу:

  sudo systemctl daemon-reload
  sudo systemctl restart service.service

Test

Чтобы проверить, что они работают, вы можете:

  • Перезагрузите сервер, затем убедитесь, что служба работает

  sudo reboot
  • Поиск номера процесса:

  ps -ef | grep service
  • Убить процесс:

  sudo kill -9 process_number
  • В течение нескольких секунд убедитесь, что служба работает

[[step-1 -—- connected-to-your-centos-7-droplet]] == Шаг 1. Подключение к вашей капле CentOS 7

Мы будем использовать CentOS 7 и MySQL, чтобы показать вам, как настраивать службы systemd.

Создайте каплю с 1 ГБ ОЗУ и выберитеCentOS 7 x64 в качестве базового образа.

Используйте SSH для подключения к серверу (пользователи Windows могут подключиться с помощью такого инструмента, как PuTTy).

ssh sammy@your_server_ip

Мы предполагаем, что вы используете учетную запись с правами sudo.

[[step-2 -—- install-mysql]] == Шаг 2 - Установка MySQL

Выполните следующие команды, чтобы загрузить и установить репозиторий MySQL Community Server:

sudo wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm

Установите сервер MySQL:

sudo yum install mysql-server -y

После завершения установки запустите службу mysqld.

(Обратите внимание, что это не то же самое, что когда мы устанавливали MySQL под Debian и Ubuntu. В других дистрибутивах MySQL запускался автоматически.)

Кроме того, мы используем новую команду systemd под названиемsystemctl для управления службой:

sudo systemctl start mysqld

Затем запустите командуmysql_secure_installation.

mysql_secure_installation

В этом случае пароль root для MySQL будет пустым, поэтому вы должны создать новый пароль. Предоставьте те же ответы на другие приглашения, что и при установке в Debian или Ubuntu (подробности см. В предыдущем разделе Debian).

[[step-3 -—- configuring-mysql-to-auto-start-after-reboot]] == Шаг 3. Настройка MySQL для автоматического запуска после перезагрузки

По умолчанию MySQL настроен на автоматический запуск после перезагрузки. Давайте посмотрим, как это работает.

Чтобы проверить, настроен ли демонmysqld для автоматического запуска во время загрузки, выполните командуsystemctl с параметромis-enabled:

sudo systemctl is-enabled mysqld.service

Результатом будет:

Outputenabled

Давайте перезагрузим машину:

sudo reboot

Когда сервер вернется, подключитесь к нему с помощью SSH.

Выполните следующую команду, чтобы проверить статус сервиса:

sudo systemctl status mysqld.service

Вывод покажет, что служба работает:

Outputmysqld.service - MySQL Community Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled)
   Active: active (running) since Fri 2015-07-31 21:58:03 EDT; 1min 52s ago
  Process: 662 ExecStartPost=/usr/bin/mysql-systemd-start post (code=exited, status=0/SUCCESS)
  Process: 625 ExecStartPre=/usr/bin/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
 Main PID: 661 (mysqld_safe)
...

Чтобы отключить службу, выполните следующую команду:

sudo systemctl disable mysqld.service

Это не остановит службу, но отключит ее. Фактически, вывод показывает, что символические ссылки были удалены:

Outputrm '/etc/systemd/system/multi-user.target.wants/mysqld.service'
rm '/etc/systemd/system/mysql.service'

Если вы хотите, вы можете перезагрузить сервер и протестировать снова, чтобы увидеть, работает ли сервер MySQL (не будет).

Или снова выполнитеsystemctl is-enabled; мы должны получить ответdisabled:

sudo systemctl is-enabled mysqld.service
Outputdisabled

Включите сервис снова:

sudo systemctl enable mysqld.service

Вывод покажет воссозданные символические ссылки:

Outputln -s '/usr/lib/systemd/system/mysqld.service' '/etc/systemd/system/mysql.service'
ln -s '/usr/lib/systemd/system/mysqld.service' '/etc/systemd/system/multi-user.target.wants/mysqld.service'

Ваш сервис автоматически запустится после перезагрузки.

[[step-4 -—- configuring-mysql-to-auto-start-after-crash]] == Шаг 4. Настройка MySQL для автоматического запуска после сбоя

Теперь посмотрим, как MySQL настроен на автоматический запуск после сбоя.

Сначала откройте файл модуляmysqld.service в редакторе (помните, службы systemd используют файлы модуля для конфигурации):

sudo nano /etc/systemd/system/multi-user.target.wants/mysqld.service

В конце файла есть директива для перезапуска:

/etc/systemd/system/multi-user.target.wants/mysqld.service

[Unit]
...

[Install]
...

[Service]
...
...
Restart=always
...

Значение параметраRestart установлено наalways. Это означает, что служба MySQL будет перезапущена для чистых или нечистых кодов выхода или тайм-аутов.

Вот где автоматический перезапуск определяется в systemd.

Как и директиваrespawn в Upstart, параметрRestart в systemd определяет, как служба должна вести себя в случае сбоя.

Не все службы systemd имеют эту возможность по умолчанию; Чтобы служба запускалась после сбоя, все, что нам нужно сделать, это добавить эту дополнительную директиву в раздел[Service] файла служебной единицы. Если заголовок раздела не существует, мы также должны добавить заголовок[Service].

Чтобы эмулировать сбой, сначала выйдите из редактора, а затем проверьте идентификатор процесса MySQL:

sudo systemctl status mysqld.service
Outputmysqld.service - MySQL Community Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled)
   Active: active (running) since Fri 2015-07-31 21:58:03 EDT; 1h 7min ago
 Main PID: 661 (mysqld_safe)
...

Завершите этот процесс сигналомkill -9. В нашем случае основной PID - 661; замените PID своим собственным:

sudo kill -9 661

Проверьте статус:

sudo systemctl status mysqld.service

Вывод покажет, что MySQL перезапустился с новым PID (в нашем случае новый идентификатор процесса - 11217):

Outputmysqld.service - MySQL Community Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled)
   Active: active (running) since Fri 2015-07-31 23:06:38 EDT; 1min 8s ago
  Process: 11218 ExecStartPost=/usr/bin/mysql-systemd-start post (code=exited, status=0/SUCCESS)
  Process: 11207 ExecStartPre=/usr/bin/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
 Main PID: 11217 (mysqld_safe)
...
...

Итак, вы видите, что сервис работает даже после сбоя.

Заключение

В этой первой части руководства мы увидели, как можно настроить службы System V, Upstart и systemd для автоматического запуска после перезагрузки или сбоя.

Мы также видели файлы, параметры конфигурации и команды, которые управляют этим поведением.

Это было больше практического введения. Мы рассмотрим концепции и основы более подробно в следующей части серии.

Пока не удаляйте капли - продолжайте их работу, так как мы вернемся к ним черезthe next part.

Related