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によって自動的に起動されず、特定の場合にのみ依存関係としてインポートされます。 )。

関連情報