ユーザーd-busサービス開始後/停止前

ユーザーd-busサービス開始後/停止前

systemdがユーザーを起動した後にスクリプトを実行し、dbus.servicesystemdが停止しようとする前に別のスクリプトを実行する必要がありますdbus.service。既存のサービスファイルを変更したくありません。このスクリプトは、再起動時にロードされたCDEmuイメージを保存して復元する必要があります。 cdemuというグローバルサービスは--bus system数年前に動作を停止しました。なぜなら、最新のディストリビューションでは、各ユーザーが独自のロードされた仮想イメージのセットを持っているからです。

-pre.service WantedBy=dbus.service私の現在のソリューションは、2つのユーザーサービス、つまりtheと-post.servicethatを持つことです。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

関連情報