tl;dr (짧은 답변)

tl;dr (짧은 답변)

나는 다음 기사를 대략적으로 기반으로 매일 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에서는 불가능합니다).

관련 정보