Як мені замінити або налаштувати системні служби?


109

Багато сценаріїв sysv init використовували відповідний файл, /etc/defaultщоб дозволити адміністратору його налаштувати. Завдання для запуску можна змінювати за допомогою .overrideфайлів. Як я можу замінити або налаштувати системні одиниці, тепер, коли systemd є типовим для Ubuntu?


Зауважте, що при очищенні поля ExecStart=з порожнім записом ви не можете ставити коментар після нього, як: ExecStart= # Empty line to clear previous entries.Це буде сприйнято як інший ExecStart=запис та додано до списку. PS. Я не зміг додати коментар до відповіді Муру через низьку репутацію.
тисик

Відповіді:


185

systemdодиниці не повинні виконувати файли в /etc/default. systemdлегко налаштовується, але вимагає знати синтаксис файлів системного блоку.

Пакети доставляють файли одиниць, як правило, у /lib/systemd/system/. Їх не слід редагувати. Натомість systemdдозволяє переосмислити ці файли, створивши відповідні файли в /etc/systemd/system/.

За дану послугу fooпакет надав би /lib/systemd/system/foo.service. Ви можете перевірити його стан за допомогою systemctl status fooабо переглянути його журнали, використовуючи journalctl -u foo. Щоб щось змінити у визначенні foo, виконайте:

sudo systemctl edit foo

Це створює каталог з /etc/systemd/systemіменем одиниці та override.confфайл у цій директорії ( /etc/systemd/system/foo.service.d/override.conf). Ви можете додати або змінити налаштування за допомогою цього файлу (або інших .confфайлів у /etc/systemd/system/foo.service.d/).

Переважні аргументи команд

Візьмемо gettyдля прикладу послугу. Скажіть, я хочу мати автологічний реєстрацію TTY2 для свого користувача (це не бажано, але лише приклад). TTY2 управляється getty@tty2службою ( tty2є екземпляром шаблону /lib/systemd/system/getty@service). Для цього мені потрібно змінити getty@tty2послугу.

$ systemctl cat getty@tty2
# /lib/systemd/system/getty@.service
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Getty on %I
Documentation=man:agetty(8) man:systemd-getty-generator(8)
Documentation=http://0pointer.de/blog/projects/serial-console.html
After=systemd-user-sessions.service plymouth-quit-wait.service
After=rc-local.service

# If additional gettys are spawned during boot then we should make
# sure that this is synchronized before getty.target, even though
# getty.target didn't actually pull it in.
Before=getty.target
IgnoreOnIsolate=yes

# On systems without virtual consoles, don't start any getty. Note
# that serial gettys are covered by serial-getty@.service, not this
# unit.
ConditionPathExists=/dev/tty0

[Service]
# the VT is cleared by TTYVTDisallocate
ExecStart=-/sbin/agetty --noclear %I $TERM
Type=idle
Restart=always
RestartSec=0
UtmpIdentifier=%I
TTYPath=/dev/%I
TTYReset=yes
TTYVHangup=yes
TTYVTDisallocate=yes
KillMode=process
IgnoreSIGPIPE=no
SendSIGHUP=yes

# Unset locale for the console getty since the console has problems
# displaying some internationalized messages.
Environment=LANG= LANGUAGE= LC_CTYPE= LC_NUMERIC= LC_TIME= LC_COLLATE= LC_MONETARY= LC_MESSAGES= LC_PAPER= LC_NAME= LC_ADDRESS= LC_TELEPHONE= LC_MEASUREMENT= LC_IDENTIFICATION=

[Install]
WantedBy=getty.target
DefaultInstance=tty1

Зокрема, я повинен змінити ExecStartлінію, яка є:

$ systemctl cat getty@tty2 | grep Exec     
ExecStart=-/sbin/agetty --noclear %I $TERM

Щоб змінити це, зробіть:

sudo systemctl edit getty@tty2

І додайте:

[Service]
ExecStart=
ExecStart=-/sbin/agetty -a muru --noclear %I $TERM

Зауважте, що:

  1. Я повинен був явно ясно , ExecStartперш ніж його знову, як це установка добавки, аналогічна After, Environment(в цілому, а нема на змінну величину) і EnvironmentFile, і в відміну від перевизначення параметрів , як RestartSecабо Type. ExecStartможе мати кілька записів лише для Type=oneshotпослуг.
  2. Мені довелося скористатись відповідним заголовком розділу. У оригінальному файлі ExecStartзнаходиться у [Service]розділі, тому мій переосмислення має бути також розміщений ExecStartу [Service]розділі. Часто перегляд фактичного файлу служби за допомогою systemctl catскаже вам, що вам потрібно переосмислити і в якому розділі він знаходиться.

Зазвичай, якщо ви редагуєте файл системного блоку, щоб він набрав чинності, потрібно запустити:

sudo systemctl daemon-reload

Однак systemctl editавтоматично це робить для вас.

Зараз:

$ systemctl cat getty@tty2 | grep Exec
ExecStart=-/sbin/agetty --noclear %I $TERM
ExecStart=
ExecStart=-/sbin/agetty -a muru --noclear %I $TERM

$ systemctl show getty@tty2 | grep ExecS
ExecStart={ path=/sbin/agetty ; argv[]=/sbin/agetty -a muru --noclear %I $TERM ; ... }

А якщо я:

sudo systemctl restart getty@tty2

і натисніть CtrlAltF2, престо! Я ввійду в свій акаунт на TTY.

Як я вже говорив, getty@tty2це екземпляр шаблону. Отже, що робити, якщо я хотів би замінити всі екземпляри цього шаблону? Це можна зробити, відредагувавши сам шаблон (видалення ідентифікатора екземпляра - у цьому випадку tty2):

systemctl edit getty@

Перевищення навколишнього середовища

Звичайне використання випадок /etc/defaultфайлів установки змінних оточення. Зазвичай /etc/defaultце скрипт оболонки, тому ви можете використовувати в ньому конструкції мови оболонок. З systemd, проте, це не так. Можна вказати змінні середовища двома способами:

Через файл

Скажіть, ви встановили змінні середовища у файлі:

$ cat /path/to/some/file
FOO=bar

Потім ви можете додати до зміни:

[Service]
EnvironmentFile=/path/to/some/file

Зокрема, якщо ваш /etc/default/grubвміст містить лише призначення та синтаксис оболонки, ви можете використовувати його як EnvironmentFile.

Через Environmentзаписи

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

[Service]
Environment=FOO=bar

Однак це може бути хитромудрим із кількома змінними, пробілами тощо. Погляньте на один з моїх інших відповідей на прикладі такого екземпляра.

Подальше читання

За допомогою цього механізму стає дуже легко переосмислити systemdодиниці, а також скасувати такі зміни (просто видаливши файл перезапису). Це не єдині настройки, які можна змінити.

Наступні посилання будуть корисними:


1
Ви повинні очистити змінну, перш ніж встановлювати її для служб, що не належать до типуhothot. Це вирішило мою проблему.
Колін

3
@MarkEdington з manpage systemd.service(5), розділ на тему ExecStart: "Якщо Type = є onehot, потрібно вказати рівно одну команду. Коли використовується Type = onehot, можна вказати нуль або більше команд. Команди можуть бути визначені шляхом надання декількох командних рядків в одній і тій же. Директива, або, як альтернатива, ця директива може бути задана не один раз з однаковим ефектом. Якщо порожній рядок призначений цій опції, список команд для початку буде скинутий, попередні призначення цього параметра не матимуть ефекту. "
муру

1
@Orient ви можете sudo rmперезаписати файл, а потім systemctl daemon-reload, або ви можете systemctl editзамінити все, що перезаписане, коментарями. Коментарі в службових файлах починаються з #.
муру

3
@Orientsystemctl revert foo
Ayell

1
Який порядок пріоритетності для трьох методів (файл перезапису, файл середовища, змінна середовище)? Тобто, для змінної, визначеної у всіх трьох, яке значення буде ефективним?
Ніколаос Какурос
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.