시스템 서비스를 재정의하거나 구성하려면 어떻게합니까?


109

많은 sysv init 스크립트는 해당 파일 /etc/default을 사용하여 관리자가 구성 할 수 있도록합니다. 시작 작업은 .override파일을 사용하여 수정할 수 있습니다 . Ubuntu에서 systemd가 기본값이므로 시스템 단위를 재정의하거나 구성하는 방법은 무엇입니까?


ExecStart=빈 항목으로 with를 지우면 다음 과 같이 주석을 달 수 없습니다. ExecStart= # Empty line to clear previous entries.이것은 다른 ExecStart=항목 으로 간주 되어 목록에 추가됩니다. 추신. 저의 명성으로 인해 muru의 답변에 의견을 추가 할 수 없었습니다.
tysik

답변:


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
oneshot 유형이 아닌 서비스에 대해 변수를 설정하기 전에 변수를 지워야합니다. 이것은 내 문제를 해결했습니다.
Colin

3
systemd.service(5)맨 페이지의 @MarkEdington 섹션 ExecStart: "Type =이 oneshot 인 경우 정확히 하나의 명령을 지정해야합니다. Type = oneshot을 사용하는 경우 0 개 이상의 명령을 지정할 수 있습니다. 동일한 명령에 여러 명령 줄을 제공하여 명령을 지정할 수 있습니다. 지시문 또는 다른 방법으로이 지시문을 동일한 효과로 두 번 이상 지정할 수 있습니다. 빈 문자열이이 옵션에 지정되면 시작할 명령 목록이 재설정되며이 옵션의 이전 지정은 적용되지 않습니다. "
muru

1
@Orient sudo rm는 재정의 파일을 누른 다음 systemctl daemon-reload을 사용하거나 systemctl edit재정의의 모든 것을 주석으로 바꿀 수 있습니다 . 서비스 파일의 주석은로 시작합니다 #.
muru

3
@Orientsystemctl revert foo
Ayell

1
세 가지 방법 (파일, 환경 파일, 환경 변수 재정의)의 우선 순위는 무엇입니까? 즉, 세 가지 모두에 정의 된 변수의 경우 어떤 값이 효과적인가?
Nikolaos Kakouros
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.