systemdがユーザーを起動した後にスクリプトを実行し、dbus.service
systemdが停止しようとする前に別のスクリプトを実行する必要がありますdbus.service
。既存のサービスファイルを変更したくありません。このスクリプトは、再起動時にロードされたCDEmuイメージを保存して復元する必要があります。 cdemuというグローバルサービスは--bus system
数年前に動作を停止しました。なぜなら、最新のディストリビューションでは、各ユーザーが独自のロードされた仮想イメージのセットを持っているからです。
-pre.service
WantedBy=dbus.service
私の現在のソリューションは、2つのユーザーサービス、つまりtheと-post.service
thatを持つことです。Requires=dbus.service
後者は自動的に一緒に停止しますdbus.service
。最初のサービスは、必要な各ユーザーに対して手動で有効にする必要があります。デッドロックを防ぐために、バックグラウンドで2番目のサービスを開始してくださいsystemctl start
。また、dbusの再起動を適切に処理し始めた後、最初のサービスはすぐに停止します。
可能であれば、サービスの数を1つに減らすことが可能かどうかを知りたいですStopWhenUnneeded
。
テストするには、Xセッションを終了して次の手順を実行します。
$ systemctl --user stop dbus
$ systemctl --user start dbus
_
# /etc/systemd/user/dbus-pre.service
[Service]
ExecStart=/usr/local/bin/dbus-hook pre-start
# will be started again when dbus restarts
RemainAfterExit=false
[Install]
# systemctl --user enable dbus-pre
WantedBy=dbus.service
_
# /etc/systemd/user/dbus-post.service
[Service]
ExecStart=/usr/local/bin/dbus-hook post-start
ExecStop=/usr/local/bin/dbus-hook pre-stop
# oneshot supposed to spare dbus until ExecStop finishes
Type=oneshot
# RemainAfterExit=true prevents immediate stop of our service
RemainAfterExit=true
[Unit]
# Requires= supposed to stop us when dbus stops
Requires=dbus.service
# After= supposed to spare dbus until our service stops
After=dbus.service
_
#!/bin/bash
# /usr/local/bin/dbus-hook
echo "$1"
case $1 in
pre-start)
echo "starting dbus-post.service..."
/usr/bin/systemctl --user start dbus-post.service >/dev/null 2>&1
;;
post-start)
echo "restoring cdemu mounts..."
if [ -f ~/.config/cdemu.save ]; then
{
read -r x
read -r x
while read -r n b f; do
if [ x"True" = x"$b" ]; then
/usr/bin/cdemu load "$n" "$f"
fi
done
} <~/.config/cdemu.save
fi
;;
pre-stop)
echo "saving cdemu mounts..."
#echo "DBUS_SESSION_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDRESS"
if /usr/bin/pgrep -u "${USER:?}" -x cdemu-daemon >/dev/null; then
mkdir -p ~/.config
/usr/bin/cdemu status >~/.config/cdemu.save
fi
;;
esac