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

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

systemd-tmpfiles --create시작하는 동안 systemd 배포판을 실행 해야 합니다 . 따라서 작업을 수행하려면 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하지만 단순한 프로그램이 아니라 systemd 자체의 일부이기 때문에 잘 모르겠습니다 . 나는 내 시스템을 깨뜨리고 싶지 않습니다.

올바른 .service 파일에 대한 제안 사항이 있습니까?

답변1

[이것은 systemd-tmpfiles의 문제를 직접적으로 해결하지는 않지만, 이 특별한 경우에는 echo를 사용하는 것이 더 낫다는 것을 깨달으실 것입니다. ]

첫째, "multi-user.target"은 사용하려는 것일 수도 있고 아닐 수도 있습니다. SysV 스타일 init 항목의 런레벨 개념에 익숙하다면 다중 사용자는 GUI 대신 콘솔로 부팅하는 다중 사용자 시스템인 systemd의 런레벨 3과 동일합니다. X의 런레벨 5로 부팅하는 것과 동일 예그래픽 타겟. 기본값은 /etc/systemd/system(및/또는 의 심볼릭 링크에 의해 결정됩니다 /lib/systemd/system. 의 심볼릭 링크는 /etc의 심볼릭 링크를 재정의합니다 /lib)기본 대상, ls를 사용하여 그것이 가리키는 위치를 찾으십시오.

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

systemctl get-default이 경우 "multi-user.target"이 표시됩니다. 일반 Linux 데스크탑의 경우그래픽 타겟. 기본 실행 수준/대상에 관계없이 생성 중인 부팅 서비스를 시작하려는 경우에는 별 문제가 되지 않습니다. 이 경우 별칭이 무엇인지 걱정하지 않고 default.target을 사용하면 됩니다. 그러나 다중 사용자를 사용하고 기본 설정이 그래픽인 경우 서비스가 발생하지 않습니다.

서비스에 따라 보다 적절하고 구체적인 목표나 관련 서비스를 출시하고 싶을 수도 있습니다. 다른 질문에 따르면 default.target이 괜찮을 수 있습니다. "대상"과 "서비스"의 차이점은 서비스에는 [Service]실제로 프로세스를 실행하는 부분이 포함되어 있다는 것입니다. 대상은 추가로 다양한 "종속" 및 "요구" 지시문을 통해 서비스를 그룹화하는 방법일 뿐입니다. 다른 것을 트리거하는 것은 대상이나 서비스 외부에서 자체적으로는 아무것도 수행하지 않습니다.

서비스가 시작되는 시기는 해당 서비스에 명시적으로 의존하는 다른 서비스에 따라 달라집니다. 시작 프로세스 후반에 실행하려는 이와 같은 간단한 독립 실행형 이벤트의 경우 다음 지침 조합을 사용할 수 있습니다.

[Unit]
Requires=local-fs.target
After=local-fs.target 

[Install]
WantedBy=default.target

서비스를 설치할 때 설치 섹션을 사용하십시오. "WantedBy="는 서비스가 포함될 대상을 지정합니다. 즉, 해당 대상에 서비스가 포함되어 있으면 해당 서비스가 실행됩니다. 특정 종속성이 없는 경우 장치를 더 빨리 실행하기보다는 나중에 실행하려면 정상적인 것이 무엇인지 살펴보고 종속성 또는 선택적 전제 조건으로 사용할 항목을 선택해야 할 수 있습니다.

구별: 합격의존내 말은, 당신의 유닛도 무언가를 활성화하고 통과해야 한다는 뜻입니다.선택적 전제 조건내 말은 당신의 장치보다 먼저 실행되어야 하는 것을 의미합니다.만약에사용 중이지만 필수는 아닙니다. 이 용어는 내 용어이지만 특히 이러한 의미에서 시스템 문서에서 사용되는 중요한 구별입니다.장치가 다음과 같은 경우 시작하는 데 필요한 종속성이 보장됩니다., 그러나 이 요구사항은 영향을 미치지 않습니다.시작되는 순서즉, 단지 종속성인 작업이 실제로 나중에 시작될 수 있음을 의미합니다(예, 이는 유닛이 먼저 시작될 수 있으므로 종속성이 성공할 것이라는 보장은 없습니다).

위의 Requires내용은 local-fs.target장치가 포함되지 않은 시스템에서 사용될 것이라고 생각하지 않는 한 약간 무의미할 수 있지만, 이를 결합하면 After장치가 포함된 후에 장치가 시작된다는 것이 보장됩니다. 따라서 이렇게 할 수는 없습니다 Requires. 의존하지 않는 장치 다음에 시작하도록 장치를 설정할 수 있으므로 "이후"에는 "필수" = 선택적 전제 조건이 없습니다. 여기의 예는 종속성과 실행 순서 사이의 개념과 차이점을 소개하기 위한 것입니다. 하나는 다른 하나를 결정하지 않습니다.

"시작"은 전제 조건이 자체 실행의 특정 지점에 도달한다는 의미는 아닙니다. 예를 들어, 원격 파일 시스템 마운트에 관한 것이고 이것이 장치에 중요한 경우 해당 서비스를 사용 Requires하고 After설정해야 할 수도 있지만, 만약을 대비해 적절한 오류 처리를 수행하려면 여전히 실제 프로세스가 실행되어야 합니다. 원격 파일 시스템 손상. 파일 시스템에 아직 액세스할 수 없습니다(예: 액세스할 수 있을 때까지 루프 상태로 대기).

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

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

이 명령에는 전체 경로가 필요합니다. 내가 사용하지 않는 이유 /usr/bin/echo "hello world"는 작동하지 않는다는 것입니다(출력이 /dev/null로 갈 것이라고 생각했습니다). 서비스가 기꺼이 실행되는 동안 echo "hello world" > /dev/console실험에 따르면 ExecStart 지시문 내에서 셸 리디렉션을 사용하면 그렇지 않습니다. ExecStart명령 때문에 작동쉘로 실행되지 않음. 하지만 다음과 같이 할 수 있습니다. /usr/local/bin/helloworld는 줄을 포함하는 쉘 스크립트입니다 echo "hello world" > /dev/console.

참고 Type=simple이는 helloworld수행 중인 작업과 기타 여러 작업에 적합합니다. 서비스가 오랫동안(몇 초 이상) 실행되는 경우 systemd는 사용 시 이를 백그라운드로 분기합니다 simple. 이는 사용자가 원하는 것입니다(또 다른 옵션은 너무 오랫동안 포그라운드에 머물기 때문에 분기하는 것입니다). 그러나 프로그램이 자체적으로 포크를 수행하는 경우(서버 및 데몬이 자주 수행하는 것처럼) 떠돌아다니는 고아 프로세스로 종료되는 를 사용해야 합니다 Type=forking. "type" 매개변수는 무엇을 하려고 하든 반드시 읽어야 하는 simple에서 자세히 다루고 있습니다 . 2man systemd.service

우리의 완전한 최소한의 서비스 파일에는 이 세 부분( [Unit], [Service][Install])만 있습니다. 설치하려면 파일이나 해당 심볼릭 링크를 /etc/systemd/system 또는 /usr/lib/systemd/system에 배치한 후 다음을 수행합니다.

systemctl --system enable helloworld

인쇄되어야 합니다 ln -s .... 이는 서비스를 실행하지 않고 위에서 언급한 대로 시작 시 실행되도록 구성할 뿐입니다.

간단히 말해서 그게 전부입니다. man systemd.unit그리고 man systemd.service더 자세한 내용이 있습니다(그런데 이 모든 것에 대한 색인이 있습니다 man systemd.directives).


  1. 블록의 StandardOutput및 매개변수를 사용하여 StandardError출력을 리디렉션 할 수 있습니다 . [Service]을 참조하십시오.man systemd.exec

  2. 모든 서비스 파일 지시문의 색인이 있으며 man systemd-directives, 이는 해당 지시문이 문서화되어 있는 매뉴얼 페이지를 나타냅니다. 예를 들면 다음과 같습니다.

    After=
        systemd.unit(5)
    
    Alias=
        systemd.unit(5)
    

답변2

systemd-tmpfiles 서비스의 경우: 배포판과 함께 제공되어야 하지만 언제든지 다음에서 얻을 수 있습니다.업스트림 Git 저장소

관련 정보