systemd
애플리케이션을 게시하고 서비스 로 등록하고 싶습니다 .
애플리케이션 외에도 애플리케이션을 systemd
서비스로 등록하는 스크립트도 제공하고 싶습니다.
그래서 현재 저는 템플릿 파일과 해당 값을 복사하고 업데이트하는 스크립트를 사용하여 myapp.service
앱을 게시하고 있습니다 .myapp.service
하지만 나는 이 해결책이 마음에 들지 않는다.
.service
명령줄에서 파일을 만들 수 있나요 ? 그것은 마치 systemd new -name myapp -description "my description" -after network.target -exec path/to/exec
?
답변1
두 가지 기본 방법이 있습니다.
컴파일 시간 구성
이는 많은 소프트웨어 패키저가 취하는 접근 방식입니다.
하나는 매크로를 사용하는 것입니다. 패키지 생성 시 구성을 나타내는 매개변수와 함께 매크로 전처리기의 일부 형태가 매크로화된 서비스 단위 파일에서 실행됩니다. 그런 다음 출력은 사용자 정의 서비스 단위 파일인 패키지에 저장됩니다.
systemd 자체가 예입니다. 이것kmod-static-nodes.service.in
파일에는 다음 매크로가 포함되어 있습니다.
ExecStart=@KMOD@ static-nodes --format=tmpfiles --output=/run/tmpfiles.d/static-nodes.conf
systemd를 빌드하는 대규모 Python 스크립트("Meson"이라고 함)에는 무엇보다도 정규식 기반 매크로 전처리기가 포함되어 있습니다. 전처리기는 에서 실행되어 매크로를 kmod-static-nodes.service.in
대체하여 수신 패키지를 KMOD
생성합니다 . replacement는 컴파일 타임에 Python 스크립트가 검색한 kmod-static-nodes.service
실행 프로그램 이미지 파일의 경로인 문자열입니다 . kmod
(대규모 Python 스크립팅 시스템에 대해서는 이 답변의 범위를 훨씬 벗어나므로 자세히 다루지 않겠습니다.)
이 시나리오의 단점은 패키지가 설치된 대상 컴퓨터와 동일한 레이아웃과 동일한 프로그램을 포함하는 컴퓨터에서 패키지를 만들어야 한다는 것입니다. 패키지는 운영 체제마다 다를 수 있습니다(또는 버전도 다를 수 있음).
설치 중 구성
임시 삽입
.conf
또 다른 접근 방식은 서비스 단위를 대상 시스템에 맞게 조정하는 삽입 파일을 생성하여 설치 시 정적 서비스 단위 파일을 구성하는 것입니다. 물론 서비스 프로세스로 내보내지기 때문에 이상적이지는 않지만 이러한 목적으로 환경 변수를 사용할 수 있습니다.
예를 들어 정적 서비스 단위 파일은 다음과 같이 /usr/lib/systemd/system/wibble.service
말할 수 있습니다 .
ExecStart=/usr/bin/wibble $OPTIONS
이것패키지 유지 관리 스크립트~을 위한설치하다그런 다음 작업은 /usr/lib/systemd/system/wibble.service.d/20-options.conf
패키지가 생성될 때 다른 시스템이 아닌 설치 시 현재 시스템에서 평가되는 사용자 정의 옵션이 포함된 파일을 설치 시 동적으로 생성합니다.
환경=옵션=swing --jelly -o 보드
이 솔루션의 단점은 패키지 유지 관리 스크립트가제거패키지가 완전히 정리된 경우 작업에서는 이 파일을 삭제해야 하며 해당 파일을 다음에 연결해야 합니다.구성콘텐츠를 재구성하거나 재배열할 때 시스템 관리자가 포함된 파일을 명시적으로 강제로 재생성할 수 있도록 하는 조치입니다.
전처리
위의 변형은 매크로 전처리로 돌아가는 것입니다. 실제로 매크로 서비스 단위 파일을 전송하고 설치 중에 전처리합니다.
패키지를 전혀 만들지 않고 시스템 관리자가 수동으로 설치할 수 있도록 모든 것을 ustar 아카이브에 넣으면 생성된 플러그인보다 이것이 더 실현 가능합니다.
단점은 Meson의 매크로 전처리 시스템이 Python 스크립트 컬렉션과 밀접하게 결합되어 있어 독립적인 도구로 사용할 수 없다는 것입니다. 독립적인 전처리 도구의 경우 다음이 있습니다.m4
및 다른 것들은 .INI 파일을 전처리하고 일반적으로 결정을 내리는 데 적합하지 않습니다(예: " 이 시스템에서 cpp
탐지 프로그램이 어떤 옵션을 사용합니까?" "이 시스템의 어디에 있습니까 ?").wibble
kmod
분명히 여기에는 아직 아무도 발견하지 못한 도구에 대한 틈새 시장이 있습니다. 적어도 제가 들어본 것입니다.
당신은 그것으로 할 수 있습니다command -v
길 찾기 수행그리고ex
교체는 쉘 스크립트에서 수행됩니다. 그러나 (대부분의 사람들은 그렇지 않습니다) 경로 이름에 공백, 메타문자 등을 방지하거나 원치 않는 매크로 확장을 방지하기 위해 이스케이프 메커니즘을 허용하는 것이 중요합니다.
Perl의 문자열 처리는 쉘 스크립팅보다 안전하지만 모든 운영 체제에 Perl이 포함되어 있는 것은 아닙니다("Perl이 없는 Unix 계열 시스템이 있습니까?"), 시스템 관리자에게 Perl이 먼저 설치되어 있는지 확인하라고 알려야 합니다. 시스템을 구축하기 위한 systemd의 방대한 Python 스크립트 모음을 고려하면 Python은 분명히 이 작업을 수행할 수 있습니다. 그러나 그에 따른 문제는 시스템 관리자가 변경한다는 것입니다. Python 버전을 확인한 다음 밑에서 깔개를 빼냅니다(“손상된 PATH 변수를 다시 빌드한 후 apt-get 업데이트가 더 이상 작동하지 않습니다." 및 Ubuntu 질문을 묻는 모든 하이퍼링크). 다른 가능성에는 TCL이 포함됩니다.
손을 잡고...
때로는 이 구성이 불필요할 수도 있습니다. systemd 의 매크로는 @KMOD@
실제로 필요하지 않습니다. 이것은 (현재) 작동합니다:
ExecStart=kmod static-nodes --format=tmpfiles --output=/run/tmpfiles.d/static-nodes.conf
데이터베이스 테이블(일종)을 서비스 단위로 바꾸시겠습니까? 발전기를 배송하십시오.
기본 활성화/비활성화 상태를 지정하시겠습니까? 배송 사전 설정.
답변2
systemd-run
명령줄에서 새로운 시스템 서비스를 시작하는 데 사용할 수 있습니다 .
systemd-run [OPTIONS...] {COMMAND} [ARGS...]
보고systemd-run --help
man systemd-run
이는 지속적인 시스템 서비스가 아니며 단위 파일을 작성해야 합니다.
예RHEL 문서: systemd-run을 사용하여 새 서비스 시작
systemd-run --unit=toptest --slice=test top -b
유닛 파일 /run/systemd/transient/
은 toptest.service
.