私の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
使用します。Wants
systemd-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.service
PartOf=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」属性を使用することは禁止されていないため、次のことができることに注意する価値があります。BoundBy
ConsistsOf
.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
私はこれらの属性をハッキング的でおそらくバグとして使用することを検討します。しかし、誰かがそれが役に立つと思うかもしれません。