フォアグラウンドでsystemdサービスを同期/実行

フォアグラウンドでsystemdサービスを同期/実行

私のXsessionを私のカスタムプログラム(設定のようなキオスク)に置き換えたいのですが。以前は、次のSTARTUPファイルに変数を設定しました.xsessionrc

STARTUP='/path/to/my/program'

今度は、ロギング、設定可能な自動再起動など、いくつかのシステム機能を利用するために、私のプログラムをシステムサービスにラップしたいと思います。以前の設定と同様に、サードパーティのセッションとウィンドウマネージャを実行するのを避けたかったのですが、セッションをアクティブに保つにはまだ何かを実行する必要があるため、次のようにしました。

STARTUP='systemd-run --user --scope /path/to/my/program'

しかし、それはまだ便利なシステムデバイスではなく、最終的に次のようになりました。

STARTUP='systemd-run --user --scope --unit my-session sleep inf'

私のプログラムが実行されるサービスユニットを定義しました。

[Unit]
Description=My service
BindsTo=my-session.scope
Requisite=my-session.scope
After=my-session.scope

[Service]
Type=exec
ExecStart=/path/to/my/program
Restart=always

[Install]
WantedBy=my-session.scope

通常、この設定は魅力的に機能しますが、動的に生成されたスコープ名に依存することは私に曖昧に見え、時にはセッションを再開するときに暗黙のクリーンアップが必要です。たとえば、次のようになります。

systemctl reset-failed my.service my-session.scope

systemdすでに苦情があるからですmy-session.scope

systemd-run --scopeだから私はシステムサービスを同期的に実行し、同時に動的に作成するのではなく、既存のユニットファイルを再利用する方法を探しています。

PS:以下を試しましたが機能しません(systemctlを中断してもホスティングサービスは中断されません)。

systemctl start --wait my-session.target

ベストアンサー1

最後に、いくつかの適切な構成が見つかりました。

a) 実行中のサービスを次に表示し、属性をStopWhenUnneeded使用します。Wantssystemd-run --scope

.xsessionrc:

STARTUP='systemd-run --user --scope --property Wants=my.service sleep inf'

私のサービス:

[Unit]
Description=My service
StopWhenUnneeded=yes

[Service]
Type=exec
ExecStart=/path/to/my/program
Restart=always

これは実際には最小限のソリューションであり、必要なすべての操作を実行しますが、my.service手動で起動することはできません。必要な場合:

b) 中間体を導入し、次のようにmy-session.target宣言します。my.servicePartOf=my-session.target

.xsessionrc:

STARTUP='systemd-run --user --scope --property Wants=my-session.target sleep inf'

私のサービス:

[Unit]
Description=My service
PartOf=my-session.target

[Service]
Type=exec
ExecStart=/path/to/my/program
Restart=always

[Install]
WantedBy=my-session.target

私のセッション。対象:

[Unit]
Description=My session
StopWhenUnneeded=yes
RefuseManualStart=yes
RefuseManualStop=yes

c)最後に/systemd-runなどの「auto-only」属性を使用することは禁止されていないため、次のことができることに注意する価値があります。BoundByConsistsOf

.xsessionrc

STARTUP='systemd-run --user --scope --property BoundBy=my.service --property Wants=my.service sleep inf'

私のサービス:

[Unit]
Description=My service

[Service]
Type=exec
ExecStart=/path/to/my/program
Restart=always

私はこれらの属性をハッキング的でおそらくバグとして使用することを検討します。しかし、誰かがそれが役に立つと思うかもしれません。

おすすめ記事