Systemd:启用的服务(简单循环)已死

Systemd:启用的服务(简单循环)已死

我有一个简单的抖动脚本来防止机器注销。

# /home/fny/jiggle.sh
randint() {
  if [ -z "$1" ]; then
    echo "Usage: randint <max>"
    return 1
  fi
  expr $(tr -dc 0-9 < /dev/urandom | head -c 10) % $(expr $1 + 1)
}

while :; do
  if [ $(xprintidle) -gt 60000 ]; then # if idle longer than 1 min
    x=$(randint 500)
    y=$(randint 500)
    echo "jiggling to $x $y"
    xdotool mousemove $x $y
  fi
  sleep 300 # check every 5 minutes
done

我决定将其变成一个简单的抖动服务:

# /home/fny/.config/systemd/user/jiggle.service
[Unit]
Description=jiggle

[Service]
Type=simple
ExecStart=/bin/sh /home/fny/jiggle.sh
Restart=always

[Install]
WantedBy=multi-user.target

我执行了所需的 systemctl 咒语:

systemctl --user daemon-reload
systemctl --user enable jiggle
systemctl --user start jiggle

我决定检查一下我的服务。它已启用但已死。为什么?

systemctl --user status jiggle

● jiggle.service - jiggle
     Loaded: loaded (/home/fny/.config/systemd/user/jiggle.service; enabled>
     Active: inactive (dead)

答案1

看来问题出在WantedBy=multi-user.target.根据这个答案

--user 模式下没有 multi-user.target。用户服务应由 WantedBy=default.target 组成。

因此,您有两种选择可以成功运行该服务。

  1. 更改为WantedBy=default.target.
# /home/fny/.config/systemd/user/jiggle.service
[Unit]
Description=jiggle

[Service]
Type=simple
ExecStart=/bin/sh /home/fny/jiggle.sh
Restart=always

[Install]
WantedBy=default.target
  1. 使用 systemd 服务作为系统服务并不是用户服务。首先,您必须复制您的jiggle serviccein /etc/systemd/system,而不是使用systemctl --user enable jiggle您应该使用sudo systemctl enable jiggle.推荐使用它,WantedBy=graphical.target因为您使用的软件依赖于 GUI 会话:
#/etc/systemd/system/jiggle.service
[Unit]
Description=jiggle

[Service]
Type=simple
ExecStart=/bin/sh /home/fny/jiggle.sh
Restart=always

[Install]
WantedBy=graphical.target

我已经在 Redhat 9.0 上测试了这些服务,并且运行成功。

相关内容