나는 다음 기사를 대략적으로 기반으로 매일 17:00에 중복 백업 작업을 실행하는 시스템 사용자 서비스를 만들었습니다.페도라 잡지. 저는 Gnome 데스크탑에서 Fedora 28을 실행하고 있습니다. 내 시스템 타이머 구성은 다음과 같습니다.
[Unit]
Description=daily-backup timer
[Timer]
OnCalendar=*-*-* 17:00:00
Unit=daily-backup.service
Persistent=true
[Install]
WantedBy=default.target
이 방법은 백업이 실행되는 동안 머신이 종료되지 않는 한 잘 작동합니다. 이 옵션을 사용하면 다음에 로그인할 때 persistent
백업이 즉시 실행됩니다 . 불행하게도 사용자 세션이 활성화되기 전에 스크립트가 실행을 시도하기 때문에 이 시점에서는 백업 스크립트가 실패합니다. 백업 스크립트는 백업 디스크가 아직 마운트되지 않은 경우 먼저 마운트를 시도합니다.
#!/usr/bin/env bash
USER=$(whoami)
MOUNTPOINT="/run/media/$USER/$2"
DEVICE=$(blkid -l -o device -t LABEL="$2")
if [ ! -d "$MOUNTPOINT" ]; then
gio mount --device $DEVICE
fi
# Call duplicity...
그러나 스크립트는 사용자 세션이 활성화될 때까지 디스크를 탑재할 수 없는 것 같습니다. 활성 세션을 폴링하여 이 문제를 해결할 수 있지만 이는 문제에 대한 조잡한 해결책입니다.
#!/usr/bin/env bash
USER=$(whoami)
MOUNTPOINT="/run/media/$USER/$2"
DEVICE=$(blkid -l -o device -t LABEL="$2")
# Poll for an active session
for i in {1..30}
do
SESSION_STATE=$(loginctl show-user "$USER" -p State --value)
[ "$SESSION_STATE" != "active" ] && sleep 1s || break
done
if [ ! -d "$MOUNTPOINT" ]; then
gio mount --device $DEVICE
fi
활성 사용자 세션을 요구하도록 내 systemd 사용자 서비스를 구성하는 방법이 있어야 할 것 같지만 이를 수행하는 방법을 알 수 없었습니다. 이것이 가능한지 아는 사람이 있습니까?
답변1
USER=$(whoami)
( 스크립트의 줄 에서 보면) 루트가 아닌 사용자로 이 서비스를 실행하고 있는 것처럼 보입니다 (아마도 파일 User=
에 설정하여 daily-backup.service
).
systemd --user
서비스 및 타이머 장치를 관리자가 실행하는 사용자 서비스로 설정하는 것을 고려할 수 있습니다 .
이렇게 하려면 디렉토리 아래에 및 를 생성하면 됩니다 daily-backup.service
. 기본적으로 시스템 디렉토리에 생성된 파일을 대부분 수정 없이 사용할 수 있습니다. (해당 참조는 귀하가 설정한 사용자가 되므로 제거할 수 있습니다.)daily-backup.timer
~$USER/.config/systemd/user/
User=
명령을 사용하여 systemctl --user ...
활성화 및 시작하고 상태를 확인합니다. 설치 부분에는 다음을 사용하십시오.
[Install]
WantedBy=default.target
사용자 관리자는 default.target
(예: 아님 multi-user.target
) 에 대해서만 알고 있으므로
부팅 시 사용자 세션이 시작되도록 하려면 linger를 활성화하면 됩니다. 이 경우 일찍 시작되어 지속됩니다.
loginctl enable-linger $USER
(문서 참조loginctl enable-linger
.)
실제로 당신이 언급한 페도라 매거진 기사를 보면 그들은 그렇게 생각하는 것 같습니다. "타이머를 이용한 자동화" 섹션은 을 참조합니다 $HOME/.config/systemd/user/
.
시스템 사용자 단위에 대해 더 자세히 알고 싶다면 Arch Linux Wiki에 좋은 자료가 있습니다.그것에 관한 기사.
답변2
tl;dr (짧은 답변)
나는 적어도 기본적으로 사용 가능한 방법(시스템 단위 지시어 등의 형태)은 없다고 생각합니다. 그러나 이는 systemd 외부에서도 확실히 가능합니다.
긴 대답
시스템이 이벤트 기반 트리거링(udev와 유사한 방식으로)을 지원하거나 자동 생성된 유닛 파일의 사용자 정의를 허용한다면 좋을 것입니다. 이 두 가지 아이디어를 모두 구현하면 문제가 해결되지만 실제로는 둘 다 systemd의 오랜 단점입니다.
이 논리를 직접 구현해 볼 수 있습니다. 실제로 달성하려는 것이 무엇인지 올바르게 이해한다면 타이머가 실행될 때 세션이 비활성화된 경우 시작을 "건너뛰는" 것과는 반대로 세션이 활성화될 때까지 시작을 "지연"한다는 의미가 필요합니다.
기본 아이디어는 시스템 버스에서 로그인된 상태 변경 이벤트를 수신하고 이에 따라 타이머를 시작/중지하는 시스템 사용자 서비스로 데몬을 시작하는 것입니다. 이는 Python에서 구현하기 쉬워야 합니다(불행히도 D-Bus에서 신호를 수신할 수 있는 쉘 친화적인 도구가 없기 때문에 bash에서는 불가능합니다).