systemd-tmpfiles를 실행하는 systemd .service 파일을 작성하는 방법


16

systemd-tmpfiles --create부팅 과정에서 systemd distro 로 실행해야합니다 . 따라서이 작업을 수행하는 systemd .service 파일을 만들어야합니다.

이 질문에서 내가 필요한 것과 왜 그런지에 대한 모든 세부 사항을 읽을 수 있습니다 : systemd-tmpfiles는 어떻게 작동합니까?

그것에 대해 몇 가지 문서를 읽었으며 다음 테스트를 작성하고 있습니다.

[Unit]
Description=Execute tmpfiles to disable usb-wakeup # see details in the link above
Requires=multi-user.target # see details in the link above
After=multi-user.target    # see details in the link above

[Service]
Type=oneshot
ExecStart=/usr/bin/systemd-tmpfiles --create

[Install]
WantedBy=multi-user.target

그러나 나는 systemd-tmpfiles단순한 프로그램이 아니라 시스템 자체 이기 때문에 확실 하지 않습니다. 시스템을 깨고 싶지 않습니다.

올바른 .service 파일에 대한 팁이 있습니까?


freedesktop.org/wiki/Software/systemd 에서 systemd에 대한 풍부한 문서를 확인하십시오 . 자신의 파일로 시스템의 기본값을 무시할 수 있습니다.
vonbrand

답변:


30

[이것은 systemd-tmpfiles 문제를 직접적으로 다루지는 않지만이 특별한 경우 echo를 사용하는 것이 더 낫다는 것을 이미 알고 있다고 생각합니다.]

우선, "multi-user.target"은 사용하고 싶거나 아닐 수도 있습니다. SysV 스타일 init 항목의 런레벨 개념에 익숙한 경우 다중 사용자는 GUI가 아닌 콘솔로 부팅하는 다중 사용자 시스템 인 런레벨 3에 해당하는 시스템입니다. 실행 레벨 5의 등가, X로 부팅입니다 graphical.target . 기본값은 default.target 이라는 심볼릭 링크 /etc/systemd/system(및 / 또는 /lib/systemd/system;에있는 /etc심볼을 대체 할 것)에 의해 결정되며 ls를 사용하여 해당 위치를 찾습니다./lib

»ls -l /etc/systemd/system/default.target
default.target -> /usr/lib/systemd/system/multi-user.target

일반적인 리눅스 데스크탑의 경우 이것은 graphic.target입니다. 기본 런레벨 / 대상이 무엇이든 관계없이 생성중인 부팅 서비스를 시작하려는 경우 실제로 중요하지 않습니다.이 경우 default.target 만 사용하고 별칭이 무엇인지 걱정하지 않아도됩니다. 그러나 다중 사용자를 사용하고 기본값이 그래픽 인 경우 서비스가 수행되지 않습니다.

서비스에 따라이를 시작하려는보다 적절하고 구체적인 대상 또는 서비스가있을 수 있습니다. 다른 질문에 따르면 default.target이 좋습니다. 참고로 "대상"과 "서비스"의 차이점은 서비스에 [Service]실제로 프로세스를 실행하는 섹션이 포함되어 있다는 것입니다. 대상은 다양한 "종속"및 "필요"지시문을 통해 서비스를 그룹화하는 방법 일뿐입니다. 다른 대상이나 서비스를 트리거하는 것 외에는 아무것도하지 않습니다.

서비스 시작 시점은 다른 서비스가 명시 적으로 의존하는 서비스에 따라 결정됩니다. 부팅 프로세스에서 늦게 실행하려는 이와 같은 간단한 독립형 이벤트의 경우 다음과 같은 지시문 조합을 사용할 수 있습니다.

[Unit]
After=default.target

[Install]
WantedBy=default.target

"설치"섹션은 서비스가 설치 될 때 사용됩니다. "WantedBy"는이 서비스에 포함 할 대상을 지정합니다 (해당 대상이 실행되는 경우 실행되지만 nb. 다른 대상과 관련하여 실행시기를 결정하지는 않음 ). 실제로이 서비스를 더 빨리 실행하기보다는 나중에 실행하기를 원하므로 "After"절을 지정합니다. 이것은 실제로 WantedBy 대상과 같을 필요는 없으며 (보통 그렇지는 않습니다) 언제 발생하는지 신경 쓰지 않으면 완전히 생략 할 수 있습니다. 나는 직감에 그것을 사용하여 대부분의 다른 것들이 지정된 무언가와 관련이있는 것들과 관련하여 실행될 것입니다 Before=default.target(우리는 또한 사용할 수 있습니다; 목표가 실행되기 전에 목표의 욕구가 평가됩니다).

예를 들어, "hello world"를 콘솔에 에코합니다. 서비스 자체는 다음 [Service]섹션에 설명되어 있습니다.

[Service]
Type=forking
ExecStart=/usr/local/bin/helloworld

이 명령에는 전체 경로가 필요합니다. 난 그냥 사용하지 않은 이유는 /usr/bin/echo "hello world"그렇지 일 것입니다 (출력이 간다, 내가 생각하면 / dev / null로) 및 수행하는 서비스하면서 echo "hello world" > /dev/console의지를, 실험이 보여 있다는 ExecStart 지시어에 쉘 리디렉션을 사용하지 않습니다 . 따라서 / usr / local / bin / helloworld는 한 줄의 쉘 스크립트입니다 echo "hello world" > /dev/console.

Type=forking쉘 스크립트에 필요한를 참고하십시오 .

우리의 완전한 최소한의 서비스 파일이 바로 그 세 부분입니다 ( [Unit], [Service], 및 [Install]). 설치하려면 파일 또는 심볼릭 링크를 / etc / systemd / system 또는 / usr / lib / systemd / system에 배치하십시오.

systemctl --system enable helloworld

인쇄해야합니다 ln -s .... 이 서비스는 실행되지 않으며 위에서 설명한대로 부팅시 실행되도록 구성합니다.

간단히 말해서. man systemd.unitman systemd.service자세한 내용이있다.


1
매우 유용한 답변과 문제가 해결되었습니다. 참고로, 나의 배포판 (Chakra Linux) default.target은에 없지만 /etc/systemd/system, 단지 안에 있습니다/usr/lib/systemd/system
eang

명령의 출력이 기록됩니까?
vonbrand

/ usr / lib / systemd / ... 파일은 폴백 (기본값)되어 있습니다. / etc / systemd / ... 파일을 삭제해야합니다.
vonbrand

요즘은 default.target에서 찾을 수 있습니다/lib/systemd/system/default.target
czerasz

1
@czerasz Fedora 27에서 주목할 systemctl set-default ...점은에 심볼릭 링크를 남겨 두면 심볼릭 링크를 /etc/systemd/system변경하지는 않습니다 /lib. 즉, 다른 대상을 가리 키지 만 전자의 항목은 후자를 재정의해야합니다. 직접 설정 한 경우 발생할 수있는 상황입니다. 어쨌든, 나는 두 위치에서 편집했습니다.
goldilocks

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.