Skip to content

Plan 9関連ユニットの設計

plan9port にはいくつかデーモンとして動作するプログラムがある。主なプログラムをいくつか挙げると

  • venti/venti
  • secstored
  • factotum
  • fontsrv
  • plumber

直接 ~/.bash_profile 等に書いても困らないのだが、どうせならsystemdで管理したい。そうなったとき、GNOMEで Wants=graphical-session.target すると DISPLAY 環境変数が設定されていなくて起動に失敗する。

Starting plumber...
/usr/lib/plan9/bin/plumber: post9pservice plumb: $NAMESPACE not set, $DISPLAY not set
plumber.service: Control process exited, code=exited, status=1/FAILURE
plumber.service: Failed with result 'exit-code'.
Failed to start plumber.

また、ここは理解が怪しいけれど、Swayではgraphical-session.targetを明示的に開始する必要があるようでそもそも graphical-session.target にリーチしないので自分でユニットを明示的に開始する必要がある。リーチするようになると Reached target Current graphical user session. というログがジャーナルに出力されて、GNOMEと同等のエラーになる。systemdにおいて環境変数がどう扱われるかはsystemdで環境変数が伝播するしくみで調査した。

DISPLAY 環境変数が設定されない問題への方針として以下の2つを考える。

  • ユニットの設定で Restart= を入れて条件が整うまでリトライする
  • ユニットをテンプレート化して DefaultInstance= を入れる
[Service]
Restart=on-failure
[Install]
DefaultInstance=default

ConditionEnvironment= 等の条件はsystemdユニットの前提条件で書いたがリトライ対象外となるので使えない。

色々試していたところSwayならこれで動作した。systemdユニットの順序を制御するで調べたように PartOf= でユニットを開始させて、After=DISPLAY 環境変数の設定を担保する。

[Unit]
PartOf=graphical-session.target
After=graphical-session.target
[Install]
WantedBy=graphical-session.target