構成ファイルを使用していくつかのレガシーサービスを単位に変換するために、構成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)
ターゲットを手動で起動すると、すべてのインスタンスが起動します。