우리는 일반 systemd 디렉터리(/etc/systemd/system 및 /usr/lib/systemd/system) 외부에 배포하려는 systemd 서비스가 있는 내부 응용 프로그램을 가지고 있습니다. 위치는 다른 디스크에 있습니다(예제에서는 /mnt/data).
systemd 서비스는 다음을 통해 활성화됩니다.
systemctl enable /mnt/data/sprinterd.service
/etc/systemd/system에 심볼릭 링크를 생성합니다.
lrwxrwxrwx. 1 root root 27 Jun 20 22:47 sprinterd.service -> /mnt/data/sprinterd.service
재시작 후 유닛 파일을 찾을 수 없어 서비스가 로딩되지 않습니다. Journalctl에서 먼저 서비스를 로드하지 못했다는 오류가 발생한 다음 해당 장치가 있는 디스크를 마운트합니다.
Cannot add dependency job for unit sprinterd.service, ignoring: Unit sprinterd.service failed to load: No such file or directory.
systemd[1]: Mounted /mnt/data.
/etc/fstab에서:
/dev/disk/by-uuid/c55e944f-5c63-48ad-8cd2-bd32d7b35c82 /mnt/data auto nosuid,nodev,nofail,x-gvfs-show 0 0
완전성을 위해 서비스 단위 파일은 다음과 같습니다.
[Unit]
Description=sprinterd
[Service]
Type=simple
Environment=TERM=linux
ExecStart=/srv/s1.erp/bin/sprinterd
Restart=always
RestartSec=5
KillSignal=SIGKILL
[Install]
WantedBy=multi-user.target
저는 이것을 RHEL 7과 openSuSE 13.2에서 테스트했습니다.
/etc 또는 /usr 외부의 다른 디스크에 시스템 서비스 단위 파일을 배치하는 기능이 지원됩니까? 디스크 마운트와 시스템 단위 파일 로드 사이의 실행 순서를 변경하는 방법은 무엇입니까?
답변1
@StephenHarris가 설명했듯이 문제는 현재 systemd가 장치를 읽으려고 시도하고 있으며 심볼릭 링크된 파일을 아직 사용할 수 없다는 것입니다.
설치 후 장치를 다시 로드하도록 systemd에 지시합니다.
[Unit]
Description=reloads units stored in /mnt/data
DefaultDependencies=no
After=mnt-data.mount
Requires=mnt-data.mount
[Service]
Type=oneshot
ExecStart=/bin/systemctl daemon-reload
[Install]
WantedBy=local-fs.target
이번에는 장치를 사용할 수 있게 됩니다.이 시간심볼릭 링크의 대상이 이미 마운트되었습니다.
하지만 그때까지 실행해야 할 작업 목록은 다음과 같습니다.기본 대상이미 구축되어 서비스 중에 익숙해시작하자.
서비스도 다시 시작하려면 다음 안내를 따르세요.
[Unit]
Description=restart unit stored in /mnt/data
Requires=mnt-data.mount
[Service]
Type=oneshot
ExecStart=/bin/systemctl daemon-reload
ExecStartPost=/bin/systemctl start sprinterd.service
[Install]
WantedBy=multi-user.target
대안:
ExecStart=
&로 테스트 했지만ExecStartPost=
분명히ExecStartPre=
&와 함께 사용해야 합니다.ExecStart=
- 1개 단위에 관한 것이라면 다음과 같이 할 수도 있습니다
ExecStart=/bin/systemctl enable /mnt/data/sprinterd.service
.데몬 다시 로드 - 서비스가 여러 개 있는 경우 다음을 수행하세요.데몬 다시 로드
ConsistsOf=
를 클릭한 다음PartOf=
여러 서비스를 모두 사용하거나 로드하는 단위를 시작합니다. - NFS(또는 다른 네트워크 시스템)인 경우 이는 분명히
local-fs.target
최선의 설치 옵션이 아닙니다.
더 오래된 학교를 위해시스템 초기화스타일 접근 방식에서는 systemctl 명령을 /etc/rc.local
파일 에 넣습니다 chmod +x
.
그런 다음 Devuan 메일링 리스트에 b0rked SystemD를 수정하기 위해 SysVInit이 필요한 방법을 게시하십시오 ;-)
답변2
이것은알려진 제한사항. 해결책을 제공해 드릴 수 있기를 바랍니다.