X가 시작된 후에만 시작되는 시스템 사용자 타이머를 만드는 방법은 무엇입니까?

X가 시작된 후에만 시작되는 시스템 사용자 타이머를 만드는 방법은 무엇입니까?

현재 다음 타이머가 있습니다.

[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의 "autostart")에 의해 명시적으로 시작되어야 합니다.

Graphical-session.target은 모든 GUI 세션에 대해 Xorg에 의해 자동으로 시작되지 않으며 특정 경우에만 종속성으로 가져옵니다(예: gnome-session.target을 통해, GNOME은 세션 관리를 위해 주로 systemd를 사용하기 때문입니다).

관련 정보