systemd가 사용자를 시작한 후에 스크립트를 실행해야 dbus.service
하고 systemd가 중지를 시도하기 전에 다른 스크립트를 실행해야 합니다 dbus.service
. 기존 서비스 파일을 수정하고 싶지 않습니다. 이 스크립트는 재부팅 시 로드된 CDEmu 이미지를 저장하고 복원해야 합니다. cdemu라는 글로벌 서비스는 --bus system
몇 년 전에 작동을 멈췄습니다. 왜냐하면 최신 배포판에서는 각 사용자가 자신만의 로드된 가상 이미지 세트를 갖고 있기 때문입니다.
-pre.service
WantedBy=dbus.service
내 현재 솔루션은 두 가지 사용자 서비스, 즉 the 와 -post.service
that을 갖는 것입니다.Requires=dbus.service
후자는 자동으로 함께 중지됩니다 dbus.service
. 첫 번째 서비스는 필요한 각 사용자에 대해 수동으로 활성화되어야 합니다. 교착 상태를 방지하기 위해 백그라운드에서 두 번째 서비스를 시작합니다 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