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