Поиск по сайту:

Как настроить службу Linux для автоматического запуска после сбоя или перезагрузки — часть 2: справочник


Автор выбрал программу Write for DOnations.

Введение

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

Это вторая половина цикла из двух частей. База данных MySQL.

Примечание. Вы также можете прочитать наше очень популярное руководство по использованию systemctl для управления службами и модулями systemd.

Предпосылки

Для выполнения этого урока вам понадобятся:

  • Сервер под управлением CentOS 8, включая пользователя без полномочий root с привилегиями sudo. Установить все это, включая брандмауэр, можно в Initial Server Setup Guide.
  • MySQL установлен. Для получения подробных инструкций следуйте нашему руководству Как установить MySQL на CentOS 8.

Настройка MySQL для автоматического запуска после загрузки с помощью systemd

Установив MySQL, проверьте статус вашего сервиса:

  1. sudo systemctl status mysqld.service

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

Output
mysqld.service - MySQL 8.0 database server Loaded: loaded (/usr/lib/systemd/system/mysqld.service; disabled; vendor preset: disabled) Active: active (running) since Thu 2020-12-24 23:48:56 UTC; 1h 6min ago Process: 30423 ExecStartPost=/usr/libexec/mysql-check-upgrade (code=exited, status=0/SUCCESS) Process: 30294 ExecStartPre=/usr/libexec/mysql-prepare-db-dir mysqld.service (code=exited, status=0/SUCCESS) Process: 30270 ExecStartPre=/usr/libexec/mysql-check-socket (code=exited, status=0/SUCCESS) Main PID: 30378 (mysqld) Status: "Server is operational" Tasks: 40 (limit: 4763) ...

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

  1. sudo systemctl disable mysqld.service

Затем запустите эту команду, чтобы проверить, требуется ли MySQL для multi-user.target:

  1. sudo systemctl show --property "Wants" multi-user.target | fmt -10 | grep mysql

Ничего не вернется. Теперь проверьте, существует ли символическая ссылка:

  1. sudo ls -l /etc/systemd/system/multi-user.target.wants/mysql*

Появится сообщение о том, что файл символической ссылки не существует:

Output
ls: cannot access '/etc/systemd/system/multi-user.target.wants/mysql*': No such file or directory

Теперь, если хотите, перезагрузите сервер и проверьте службу MySQL. Он не должен работать.

Независимо от того, перезагрузились вы или нет, теперь снова включите службу MySQL:

  1. sudo systemctl enable mysqld.service

На этот раз система создаст символическую ссылку в разделе /etc/systemd/system/multi-user.target.wants/:

Output
Created symlink /etc/systemd/system/multi-user.target.wants/mysqld.service → /usr/lib/systemd/system/mysqld.service.

Запустите команду ls еще раз, чтобы подтвердить это:

  1. sudo ls -l /etc/systemd/system/multi-user.target.wants/mysql*

Вы получите такой вывод:

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

Включение или отключение службы systemd создает или удаляет символическую ссылку из каталога желаний цели по умолчанию.

Если хотите, снова перезагрузите дроплет, а когда он вернется в сеть, запустите команду ps -ef, чтобы проверить статус службы.

  1. ps -ef | grep mysql

Эта команда предоставит информацию о MySQL, если она запущена:

[secondary_label Output]\
mysql        851       1  2 04:26 ?        00:00:02 /usr/libexec/mysqld --basedir=/usr

Теперь вы настроили MySQL для перезапуска после перезагрузки. Далее вы будете учитывать сбои.

Настройка MySQL для автоматического запуска после сбоя с помощью systemd

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

Откройте файл сервисного модуля MySQL в редакторе:

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

После информации заголовка содержимое файла выглядит следующим образом:


[Unit]

Description=MySQL 8.0 database server
After=syslog.target
After=network.target

[Service]

Type=notify
User=mysql
Group=mysql

ExecStartPre=/usr/libexec/mysql-check-socke
ExecStartPre=/usr/libexec/mysql-prepare-db-dir %n
`# Note: we set --basedir to prevent probes that might trigger SELinux alarms,`
`# per bug #547485`
ExecStart=/usr/libexec/mysqld --basedir=/usr
ExecStartPost=/usr/libexec/mysql-check-upgrade
ExecStopPost=/usr/libexec/mysql-wait-stop

`# Give a reasonable amount of time for the server to start up/shut down`

TimeoutSec=300

`# Place temp files in a secure directory, not /tmp`

PrivateTmp=true

Restart=on-failure

RestartPreventExitStatus=1

`# Sets open_files_limit`

LimitNOFILE = 10000

`# Set enviroment variable MYSQLD_PARENT_PID. This is required for SQL restart command.`

Environment=MYSQLD_PARENT_PID=1

[Install]

WantedBy=multi-user.target

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

Страница руководства для службы systemd показывает следующую таблицу для параметров перезапуска:

Restart settings/Exit causes no always on-success on-failure on-abnormal on-abort on-watchdog
Clean exit code or signal X X
Unclean exit code X X
Unclean signal X X X X
Timeout X X X
Watchdog X X X X

В файле сервисного модуля systemd два параметра — Restart и RestartSec — управляют поведением при сбое. Первый параметр указывает, когда служба должна перезапуститься, а второй параметр определяет, как долго она должна ждать перед перезапуском.

Чтобы проверить поведение при сбое, остановите процесс MySQL с помощью сигнала kill -9. В нашем случае основной PID — 851; замените PID на свой:

пс-эф | grep mysql

  1. sudo kill -9 851

Подождите несколько секунд, а затем проверьте статус:

  1. sudo systemctl status mysqld.service

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

Output
mysqld.service - MySQL 8.0 database server Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled) Active: active (running) since Fri 2020-12-25 04:47:48 UTC; 55s ago Process: 1420 ExecStopPost=/usr/libexec/mysql-wait-stop (code=exited, status=0/SUCCESS) Process: 1559 ExecStartPost=/usr/libexec/mysql-check-upgrade (code=exited, status=0/SUCCESS) Process: 1476 ExecStartPre=/usr/libexec/mysql-prepare-db-dir mysqld.service (code=exited, status=0/SUCCESS)Process: 1451 ExecStartPre=/usr/libexec/mysql-check-socket (code=exited, status=0/SUCCESS) Main PID: 1513 (mysqld) Status: "Server is operational" ...

Затем снова откройте файл модуля:

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

Закомментируйте директиву Restart в юнит-файле демона MySQL и сохраните ее. Это отключит поведение перезапуска:


`# Restart=on-failure`

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

  1. sudo systemctl daemon-reload
  2. sudo systemctl restart mysqld.service

Вы можете найти основной PID службы, выполнив эту команду:

  1. sudo systemctl status mysqld.service
Output
. . . Main PID: 1895 (mysqld)

С помощью команды kill -9 уничтожьте основной PID MySQL PID в вашей среде (мы используем PID в нашей тестовой среде).

sudo kill -9 1895

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

  1. sudo systemctl status mysqld.service

Это покажет, что служба не удалась:

Output
mysqld.service - MySQL 8.0 database server Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled) Active: **failed** (Result: signal) since Fri 2020-12-25 05:07:22 UTC; 1min 14s ago Process: 1976 ExecStopPost=/usr/libexec/mysql-wait-stop (code=exited, status=0/SUCCESS) Process: 1940 ExecStartPost=/usr/libexec/mysql-check-upgrade (code=exited, status=0/SUCCESS) Process: 1895 ExecStart=/usr/libexec/mysqld --basedir=/usr (code=killed, signal=KILL) Process: 1858 ExecStartPre=/usr/libexec/mysql-prepare-db-dir mysqld.service (code=exited, status=0/SUCCESS Process: 1833 ExecStartPre=/usr/libexec/mysql-check-socket (code=exited, status=0/SUCCESS) Main PID: 1895 (code=**killed**, signal=KILL) ...

Попробуйте найти статус службы несколько раз. Каждый раз служба будет отображаться как failed.

Итак, мы эмулировали сбой, когда служба остановилась и не вернулась. Это связано с тем, что мы указали systemd не перезапускать службу после нечистой остановки. Если вы отредактируете файл модуля mysqld.service, раскомментировав параметр Restart, сохраните его, перезагрузите демон systemctl и, наконец, перезапустите службу, это восстановит нормальную работу.

Вот как вы можете настроить собственный сервис systemd для автоматического запуска после сбоя. Все, что вам нужно сделать, это добавить дополнительную директиву для Restart (и, возможно, RestartSec) в разделе [Service] файла службы.

Заключение

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