구성 파일을 사용하여 일부 레거시 서비스를 단위로 변환하기 위해 systemd
구성 파일에 따라 일부 서비스와 해당 서비스가 필요한 대상을 생성하는 생성기와 유사한(즉, 실제로 시스템 생성기가 아닌) 서비스를 작성했습니다. 대상은 부팅 중에(생성기가 실행된 후) 시작되어야 합니다.
내가 이 일을 하는 이유아니요일반적인 시스템 발전기 장치를 사용하는 것은 상당히 제한적입니다.
실행 중인 시스템에서 테스트할 때 모든 것이 괜찮은 것처럼 보이지만 재부팅 후 대상이 시작되지 않습니다. 일반적으로 대상을 수동으로 시작하는 것으로 충분합니다.
내 발전기 세트의 기본 사항은 다음과 같습니다.
[Unit]
Description=instance generator
Wants=nss-user-lookup.target time-sync.target paths.target
After=nss-user-lookup.target time-sync.target paths.target
Before=default.target iotwatch.target
ConditionPathExists=/etc/iotwatch.conf
Conflicts=shutdown.target
[Service]
Type=oneshot
ExecStart=/usr/lib/iotwatch/iotwatch-generator /run/systemd/system
TimeoutStartSec=10
RestartPreventExitStatus=2 3 4 5 7
SuccessExitStatus=7
StartLimitBurst=100
StartLimitInterval=2
RemainAfterExit=true
[Install]
WantedBy=default.target iotwatch.target
대상 유닛은 다음과 같습니다.
[Unit]
Description=iotwatch
Wants=paths.target [email protected] [email protected] [email protected] [email protected]
After=paths.target [email protected] [email protected] [email protected] [email protected]
After=nss-lookup.target time-sync.target
[Install]
WantedBy=default.target
Wants=
및 목록은 After=
생성기 장치에 의해 동적으로 추가됩니다.
일반적인 인스턴스 단위는 기본적으로 다음과 같습니다.
# generated from /etc/iotwatch.conf for VAR (1fa9d6b1)
[Unit]
Description=iotwatch I/O performance monitor instance "VAR"
SourcePath=/etc/iotwatch.conf
PartOf=iotwatch.target
Requires=iotwatch-generator.service
After=iotwatch-generator.service
Wants=nss-user-lookup.target time-sync.target paths.target
After=nss-user-lookup.target time-sync.target paths.target
ConditionPathExists=/dev/v04/var
Conflicts=shutdown.target
[Service]
Type=forking
WorkingDirectory=/run/iotwatch-VAR
ExecStartPre=/bin/sh -c '[ -d "/run/iotwatch-VAR" ] || mkdir -p "/run/iotwatch-VAR" || exit 3'
ExecStartPre=/bin/sh -c '[ -h "/run/iotwatch-VAR/iotwatch-VAR" ] || ln -s "/usr/bin/iotwatch" "/run/iotwatch-VAR/iotwatch-VAR" || exit 3'
ExecStartPre=/bin/sh -c '[ -d "/var/log/iotwatch/VAR" -o 1 -eq 0 ] || mkdir "/var/log/iotwatch/VAR" || exit 3'
ExecStart=@/run/iotwatch-VAR/iotwatch-VAR iotwatch-VAR -l /var/log/iotwatch/VAR/iotwatch-VAR.log -m I -p/run/iotwatch-VAR/iotwatch-VAR.pid -d1 ...
ExecStartPost=/usr/bin/sleep 0.2
TimeoutStartSec=10
ExecStop=/run/iotwatch-VAR/iotwatch-VAR -l /var/log/iotwatch/VAR/iotwatch-VAR-stop.log -m I -p/run/iotwatch-VAR/iotwatch-VAR.pid -d0
TimeoutStopSec=30
PIDFile=/run/iotwatch-VAR/iotwatch-VAR.pid
Restart=always
RestartSec=10s
RestartPreventExitStatus=1 3
[Install]
WantedBy=iotwatch.target
(이 장치는 현재 생성기가 수행하는 작업을 수행하는 LSB 스크립트에서 변환되었으므로 조금 더 복잡합니다)
모든 서비스가 활성화되었습니다. 발전기 세트가 종료되기 전에 실행된 마지막 명령은 입니다 /usr/bin/systemctl daemon-reload
.
무엇이 문제일 수 있으며 (깨끗한) 해결책이 있습니까?
시작하는 동안 어떤 일이 발생합니까?
시스템을 시작하면 발전기가 시작되고 Default
목표에 도달합니다.
그러나 나는 보았다
systemd[1]: 휘발성 파일 및 디렉터리 생성을 시작할 수 없습니다.
그 이유는 LDAP 제공 사용자를 사용하여 임시 디렉터리가 생성되고 있고 LDAP 클라이언트(NSS)가 아직 준비되지 않았기 때문입니다. 하지만 로그인할 수 있고 systemctl start systemd-tmpfiles-setup.service
. 내 서비스 장치가 여전히 시작되지 않습니다.
현재 서비스 상태는 다음과 같습니다.
# systemctl status iotwatch.target
● iotwatch.target - iotwatch I/O performance monitor
Loaded: loaded (/run/systemd/system/iotwatch.target; enabled; vendor preset: disabled)
Active: inactive (dead)
# systemctl status iotwatch-generator.service
● iotwatch-generator.service - I/O performance monitor instance generator
Loaded: loaded (/usr/lib/systemd/system/iotwatch-generator.service; enabled; vendor preset: disabled)
Active: active (exited) since Fri 2023-11-24 12:06:16 CET; 20min ago
Main PID: 3075 (code=exited, status=0/SUCCESS)
Tasks: 0 (limit: 512)
Memory: 0B
CGroup: /system.slice/iotwatch-generator.service
Nov 24 12:06:15 rksapv04 systemd[1]: Starting I/O performance monitor instance generator...
Nov 24 12:06:16 rksapv04 systemd[1]: Started I/O performance monitor instance generator.
# systemctl status [email protected]
● [email protected] - iotwatch I/O performance monitor instance "VAR"
Loaded: loaded (/etc/iotwatch.conf; enabled; vendor preset: disabled)
Active: inactive (dead)
대상을 수동으로 시작하면 모든 인스턴스가 시작됩니다.