如何创建一个仅在 X 启动后才启动的 systemd 用户计时器?

如何创建一个仅在 X 启动后才启动的 systemd 用户计时器?

我目前有这个计时器:

[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 进行会话管理)。

相关内容