我有一个简单的抖动脚本来防止机器注销。
# /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 组成。
因此,您有两种选择可以成功运行该服务。
- 更改为
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
- 使用 systemd 服务作为系统服务并不是用户服务。首先,您必须复制您的
jiggle servicce
in/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 上测试了这些服务,并且运行成功。