현재 다음 타이머가 있습니다.
[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를 사용하기 때문입니다).