Введение в systemd: Практическое руководство 1. Включение компьютера Второе. Запуск службы Три. Прекращение обслуживания Четыре. Понять конфигурационный файл. Пятый, [Блок] единицы: порядок запуска и зависимости. Шесть, [Сервис] Блок: Запуск действия 6.1 Команда запуска 6.2 Тип запуска 6.3 Перезагрузка поведения Семь, [Установка] блок Восьмое. Конфигурационный файл Target. Девять. Перезагрузите после изменения конфигурационного файла. Информация о документе
Автор: Руань Ифэн
Дата: 8 марта 2016 года
В предыдущей статье я представил Systemd.
Основные команды
Сегодня я расскажу, как использовать его для выполнения некоторых основных задач.
Для тех программ, которые поддерживают Systemd, во время установки они автоматически будут в
/usr/lib/systemd/system
Добавьте файл конфигурации в каталог. Если вы хотите, чтобы это программное обеспечение запускалось при загрузке, выполните следующую команду (в качестве
httpd.service
в качестве примера).
$ sudo systemctl enable httpd
Вышеупомянутая команда эквивалентна в
/etc/systemd/system
Добавить символическую ссылку в каталог, указывающую на
/usr/lib/systemd/system
внутри
httpd.service
Файл. Это связано с тем, что при включении,
Systemd
Только выполнять
/etc/systemd/system
Конфигурационные файлы в каталоге. Это также означает, что если изменить конфигурационный файл и поместить его в этот каталог, можно достичь эффекта замены оригинальной конфигурации.
После настройки автозапуска программа не запустится сразу, нужно дождаться следующего включения компьютера. Если вы хотите запустить программу сейчас, выполните
systemctl
start
Команда. После установки автозапуска программа не запустится немедленно, она начнет работать только при следующем включении. Если вы хотите запустить программу сейчас, вам нужно выполнить
systemctl start
Команда.
x
$ sudo systemctl start httpd
После выполнения команды выше может возникнуть ошибка при запуске, поэтому необходимо использовать
systemctl
status
Команда для проверки состояния этой службы.
x
$ sudo systemctl status httpdhttpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled) Active: active (running) since 金 2014-12-05 12:18:22 JST; 7min ago Main PID: 4349 (httpd) Status: "Total requests: 1; Current requests/sec: 0; Current traffic: 0 B/sec" CGroup: /system.slice/httpd.service ├─4349 /usr/sbin/httpd -DFOREGROUND ├─4350 /usr/sbin/httpd -DFOREGROUND ├─4351 /usr/sbin/httpd -DFOREGROUND ├─4352 /usr/sbin/httpd -DFOREGROUND ├─4353 /usr/sbin/httpd -DFOREGROUND └─4354 /usr/sbin/httpd -DFOREGROUND12月 05 12:18:22 localhost.localdomain systemd[1]: Starting The Apache HTTP Server...12月 05 12:18:22 localhost.localdomain systemd[1]: Started The Apache HTTP Server.12月 05 12:22:40 localhost.localdomain systemd[1]: Started The Apache HTTP Server.
Вывод выше означает следующее.
Loaded行: расположение конфигурационного файла, установить ли его для автозагрузки. Активный: означает, что работает. Основной PID: основной идентификатор процесса Статус: текущее состояние программного обеспечения, предоставляемого самим приложением (в данном случае httpd). CGroup блок: все подпроцессы приложения Журнал блока: журналы приложения
Необходимо выполнить остановку работающей службы.
systemctl stop
Команда.
xxxxxxxxxx$ sudo systemctl stop httpd.service
有时候,该命令可能没有响应,服务停不下来。这时候就不得不"杀进程"了,向正在运行的进程发出
kill
Сигнал.
xxxxxxxxxx$ sudo systemctl kill httpd.service
Кроме того, необходимо выполнить перезапуск службы.
systemctl restart
Команда.
x
$ sudo systemctl restart httpd.service
Как запускается сервис, полностью зависит от его конфигурационного файла. Давайте посмотрим, что содержится в конфигурационном файле.
Ранее говорилось, что конфигурационные файлы в основном находятся в
/usr/lib/systemd/system
Содержимое, возможно, также в
/etc/systemd/system
Содержание. Найдите файл конфигурации, затем откройте его с помощью текстового редактора.
systemctl
cat
Команда может быть использована для просмотра конфигурационного файла, ниже приведено.
sshd.service
Файл служит примером, его задача - запустить SSH-сервер, чтобы другие пользователи могли входить через SSH.
xxxxxxxxxx$ systemctl cat sshd.service[Unit]Description=OpenSSH server daemonDocumentation=man:sshd(8) man:sshd_config(5)After=network.target sshd-keygen.serviceWants=sshd-keygen.service[Service]EnvironmentFile=/etc/sysconfig/sshdExecStart=/usr/sbin/sshd -D $OPTIONSExecReload=/bin/kill -HUP $MAINPIDType=simpleKillMode=processRestart=on-failureRestartSec=42s[Install]WantedBy=multi-user.target
Можно увидеть, что конфигурационный файл разделен на несколько блоков, каждый из которых содержит несколько пар ключ-значение.
Ниже последовательно объясняется содержание каждого блока.
Unit
блока
Description
Поле содержит простое описание текущей услуги.
Documentation
Поле указывает местоположение документа. Следующие настройки - это порядок запуска и зависимости, что довольно важно.
AfterПоле: обозначает еслиnetwork.targetилиsshd-keygen.serviceНужно запустить, тогдаsshd.serviceСледует запустить их после этого.
Соответственно, есть еще один.
Before
поле, определение
sshd.service
Следует запустить перед какими услугами. Обратите внимание,
After
и
Before
Поле касается только порядка запуска, не затрагивая зависимости.
например, веб-приложение нуждается в базе данных postgresql для хранения данных. В конфигурационном файле оно просто определяет, что должно запускаться после postgresql, но не указывает зависимость от postgresql. После выхода в продуктив, по какой-то причине, postgresql нужно перезапустить, и во время остановки службы веб-приложение не сможет установить соединение с базой данных. Чтобы установить зависимость, необходимо использовать
Wants
поле и
Requires
Поле.
WantsПоле: обозначаетsshd.serviceиsshd-keygen.service之间存在"弱依赖"关系,即如果"sshd-keygen.service"启动失败或停止运行,不影响sshd.serviceПродолжайте выполнять.
Requires
字段则表示"强依赖"关系,即如果该服务启动失败或异常退出,那么
sshd.service
Также нужно выйти.
Обратите внимание,
Wants
поля и
Requires
Поле касается только зависимостей и не связано с порядком запуска, по умолчанию они запускаются одновременно.
Service
Как определить блок для запуска текущей службы.
Многое программное обеспечение имеет свои файлы параметров окружения, которые можно использовать для
EnvironmentFile
Чтение полей.
EnvironmentFileПоле: Укажите файл параметров окружения для текущей службы. Внутри этого файлаkey=valueПарные ключи, можно использовать$keyв форме, получаемой в текущем конфигурационном файле.
В приведенном примере файл переменных окружения для sshd - это
/etc/sysconfig/sshd
Самое важное поле в конфигурационном файле — это
ExecStart
。
ExecStartПоле: Определяет команду, выполняемую при запуске процесса.
В приведённом выше примере, запуск.
sshd
исполняемая команда это
/usr/sbin/sshd -D
$OPTIONS
в которых переменные
$OPTIONS
просто из
EnvironmentFile
Параметры среды, указанные в поле. Существуют и другие поля с аналогичным воздействием.
ExecReloadПоле: Команда, выполняемая при перезапуске службы
ExecStopПоле: Команда, выполняемая при остановке службы
ExecStartPreПоле: Команда, выполняемая перед запуском службы
ExecStartPostПоле: Команда, выполняемая после запуска службы
ExecStopPostПоле: Команда, выполняемая после остановки службы
Пожалуйста, посмотрите на следующий пример.
xxxxxxxxxx[Service]ExecStart=/bin/echo execstart1ExecStart=ExecStart=/bin/echo execstart2ExecStartPost=/bin/echo post1ExecStartPost=/bin/echo post2
В этом конфигурационном файле, на второй строке
ExecStart
Установить в значение пусто, это равно отмене настроек первой строки, результат выполнения следующий.
xxxxxxxxxxexecstart2post1post2
Перед всеми настройками запуска можно добавить дефис.
-
),表示"抑制错误",即发生错误的时候,不影响其他命令的执行。比如,
EnvironmentFile=-/etc/sysconfig/sshd
(Обратите внимание на дефис после знака равенства), это означает, что даже если.
/etc/sysconfig/sshd
Файл не существует и не выдаст ошибку.
Type
Определение поля типа запуска. Возможные значения для него следующие.
простой (значение по умолчанию):
ExecStartПроцесс запуска поля является главным процессом.forking:
ExecStartПоле будет заполненоfork()Запуск в таком режиме приведет к тому, что родительский процесс завершится, а дочерний процесс станет основным процессом.аналогично
simpleНо выполняется только один раз, Systemd будет ждать его завершения, прежде чем запустить другие службы.dbus: аналогично
simpleно будет запущен после получения сигнала D-Busуведомить: похоже на
simpleПосле завершения загрузки будет отправлен сигнал уведомления, после чего Systemd запустит другие службы.похожий на
simpleОднако этот сервис будет запущен только после завершения других задач. Одним из случаев использования является то, чтобы вывод этого сервиса не смешивался с выводами других сервисов.
xxxxxxxxxx[Unit]Description=Switch-off Touchpad[Service]Type=oneshotExecStart=/usr/bin/touchpad-off[Install]WantedBy=multi-user.target
В конфигурационном файле выше тип запуска установлен на
oneshot
Это означает, что эта служба должна запускаться только один раз и не требует длительного выполнения. Если она будет закрыта, и в будущем вы захотите ее снова открыть, измените файл конфигурации следующим образом.
xxxxxxxxxx[Unit]Description=Switch-off Touchpad[Service]Type=oneshotExecStart=/usr/bin/touchpad-off startExecStop=/usr/bin/touchpad-off stopRemainAfterExit=yes[Install]WantedBy=multi-user.target
в приведенном выше конфигурационном файле,
RemainAfterExit
Поле установлено как
yes
это означает, что после выхода процесса служба продолжает выполняться. В таком случае, как только будет использовано
systemctl
stop
Приказ остановить службу.
ExecStop
Указанная команда будет выполнена, что позволит снова включить сенсорную панель.
Service
В блоке есть некоторые поля, определяющие поведение перезапуска.
KillModeПоле: Определяет, как Systemd останавливает службу sshd.
В приведенном выше примере,将
KillMode
Установить как
process
Это означает, что останавливается только главный процесс, а все дочерние процессы sshd продолжают работать, то есть открытые дочерними процессами SSH-сессии остаются подключенными. Эта настройка не очень распространена, но она важна для sshd, иначе при остановке службы вы также убьете свои собственные открытые SSH-сессии.
KillMode
Настройки полей могут быть следующими.
control-group (значение по умолчанию): все дочерние процессы в текущей контрольной группе будут убиты.
процесс: убить только главный процесс
Смешанный: основной процесс получит сигнал SIGTERM, а дочерний процесс получит сигнал SIGKILL.
Никакие процессы не будут убиты, просто выполняется команда остановки сервиса.
Далее идет
Restart
Поле.
RestartПоле: определяет способ перезапуска Systemd после выхода sshd.
В приведенном выше примере,
Restart
Установить как
on-failure
в случае любого неожиданного сбоя будет перезапущен sshd. Если sshd завершится нормально (например, при выполнении
systemctl
stop
Команда), она не перезагрузится.
Restart
Настройки полей могут быть следующими.
нет (значение по умолчанию): после выхода не будет перезапуска
on-success: перезапуск будет осуществлен только при нормальном завершении (код завершения 0).
on-failure: перезапуск будет происходить только в случае ненормального завершения (код выхода не равен 0), включая завершение по сигналу и таймаут.
on-abnormal: Перезапуск будет происходить только при завершении сигнала и таймаута.
on-abort: перезапустится только при получении сигнала завершения, который не был перехвачен.
on-watchdog: перезапуск только в случае выхода по таймауту.
всегда: независимо от причины выхода, всегда перезапускайте.
Для демонов рекомендуется установить
on-failure
Для тех услуг, которые допускают ошибочный выход, можно установить
on-abnormal
。
в конце это
RestartSec
Поле.
RestartSecПоле: указывает количество секунд, которое необходимо подождать перед перезапуском службы Systemd. В приведенном выше примере установлено ожидание в 42 секунды.
Install
Блок, определите, как установить этот конфигурационный файл, то есть как сделать его запуск при включении.
WantedByПоле: указывает на цель, к которой относится данная служба.
Target
означает группу услуг, обозначающую набор сервисов.
WantedBy=multi-user.target
имеется в виду, что целевая система, в которой находится sshd, это
multi-user.target
Это настройка очень важна, потому что выполнение
systemctl
enable sshd.service
при команде,
sshd.service
символическая ссылка будет помещена в
/etc/systemd/system
под каталогом
multi-user.target.wants
В подкаталоге. У systemd есть целевой запуск по умолчанию.
xxxxxxxxxx$ systemctl get-defaultmulti-user.target
Результат выше показывает, что целевой запуск по умолчанию — это
multi-user.target
Все службы в этой группе будут запускаться при загрузке. Вот почему.
systemctl
enable
Причина, по которой команды могут настраивать автозагрузку, заключается в том, что при использовании Target,
systemctl
list-dependencies
команды и
systemctl isolate
Команды тоже очень полезны.
xxxxxxxxxx# Просмотр всех служб, включенных в multi-user.target$ systemctl list-dependencies multi-user.target# Переключиться на другую цель# shutdown.target — это состояние выключения.$ sudo systemctl isolate shutdown.target
В общем, обычно используются два основных Target: один из них это
multi-user.target
, указывающий на состояние командной строки для нескольких пользователей; другой - это
graphical.target
это обозначает состояние графического пользователя, оно зависит от
multi-user.target
Официальный документ содержит очень четкое изображение.
Целевая зависимость графа
。
У Target также есть собственный конфигурационный файл.
xxxxxxxxxx$ systemctl cat multi-user.target[Unit]Description=Multi-User SystemDocumentation=man:systemd.special(7)Requires=basic.targetConflicts=rescue.service rescue.targetAfter=basic.target rescue.service rescue.targetAllowIsolate=yes
Обратите внимание, что в конфигурационном файле Target нет команды запуска. В приведенных выше результатах основные поля имеют следующее значение.
RequiresПоле: Требованияbasic.targetЗапустим вместе.
ConflictsПоле: конфликтующее поле. Еслиrescue.serviceилиrescue.targetВ процессе работы.multi-user.targetНе может работать, и наоборот.
After: обозначаетmulti-user.targetв наличииbasic.target、rescue.service、rescue.targetЗатем запустите, если они имеют запуск.
AllowIsolateРазрешено использоватьsystemctl isolateПереключить наmulti-user.target。
После изменения конфигурационного файла необходимо перезагрузить конфигурационный файл, а затем перезапустить соответствующие службы.
x
# Перезагрузить конфигурационный файл$ sudo systemctl daemon-reload# Перезапуск связанных служб$ sudo systemctl restart foobar
(Конец)
Авторское заявление: Свободное воспроизведение - некоммерческое - без производных - с указанием авторства ( Лицензия Creative Commons 3.0 )
Дата публикации: 8 марта 2016 года
Вы недавно использовали: