![如何创建一个仅在 X 启动后才启动的 systemd 用户计时器?](https://linux22.com/image/213939/%E5%A6%82%E4%BD%95%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E4%BB%85%E5%9C%A8%20X%20%E5%90%AF%E5%8A%A8%E5%90%8E%E6%89%8D%E5%90%AF%E5%8A%A8%E7%9A%84%20systemd%20%E7%94%A8%E6%88%B7%E8%AE%A1%E6%97%B6%E5%99%A8%EF%BC%9F.png)
我目前有这个计时器:
[Unit]
Description=Schedule wallpaper rotation
[Timer]
OnCalendar=*-*-* *:00:00
Persistent=true
[Install]
WantedBy=graphical-session.target
运行此服务的:
[Unit]
Description=Rotate wallpapers
[Service]
Type=oneshot
ExecStart=%h/bin/wpman %h/docs/media/wallpaper/arkady
它运行这个脚本:
#!/bin/bash
TARGET="${1}"
CURRENT=
NEXT=
REST=
LISTFILE="${HOME}/.wallpaper-list"
TARGFILE="${HOME}/.wallpaper-target"
WALLFILE="${HOME}/.wallpaper"
if [[ ! -d "${TARGET}" ]]; then
echo "Invalid target: '${TARGET}'"
exit 1
fi
TARGET="$(realpath "${TARGET}")"
[[ -f "${TARGFILE}" ]] && CURRENT="$(cat "${TARGFILE}")"
if [[ -f "${LISTFILE}" ]]; then
NEXT="$(head -n 1 "${LISTFILE}")"
REST="$(tail -n +2 "${LISTFILE}")"
fi
mklist() {
find "${TARGET}" -mindepth 1 -maxdepth 1 -type f | sort -R > "${LISTFILE}"
echo "${TARGET}" > "${TARGFILE}"
NEXT="$(head -n 1 "${LISTFILE}")"
REST="$(tail -n +2 "${LISTFILE}")"
}
set-wallpaper() {
feh --bg-fill "${NEXT}"
echo "${REST}" > "${LISTFILE}"
cp "${NEXT}" "${WALLFILE}"
}
if [[ -z "${CURRENT}" ]] || ([[ -n "${CURRENT}" ]] && [[ "${CURRENT}" != "${TARGET}" ]]) || [[ ! -f "${LISTFILE}" ]] || [[ -z "${NEXT}" ]]; then
mklist
fi
set-wallpaper
但它没有开始。我考虑过启动它timers.target
并检查我的脚本是否$DISPLAY
为空,如果是则退出,但我不确定如果以$DISPLAY
这种方式启动,脚本是否可用。 FWIW,我没有运行任何桌面环境,只是 X 和窗口管理器。我不确定这是否会影响graphical-session.target
触发方式。
有没有办法让它按照我想要的方式工作?也许 systemd 计时器不是最好的方法。
答案1
FWIW,我没有运行任何桌面环境,只是 X 和窗口管理器。我不确定这是否会影响 Graphical-session.target 的触发方式。
是的 – .target 需要由您的 ~/.xinitrc(或由您的 WM 的“自动启动”)明确启动。
Graphical-session.target 不会由 Xorg 针对每个 GUI 会话自动启动,仅在特定情况下作为依赖项拉入(例如通过 gnome-session.target,因为 GNOME 主要使用 systemd 进行会话管理)。