시스템 타이머가 sh 스크립트를 실행하지 않는 이유는 무엇입니까?

시스템 타이머가 sh 스크립트를 실행하지 않는 이유는 무엇입니까?

youtube.sh파일은 다음 위치에 있습니다 /home/deck/Desktop/youtube.sh.

#1/bin/env bash
pactl -- set-sink-volume 0 100%
xdg-open A youtube video link

youtube.timer파일은 다음 위치에 있습니다 /etc/systemd/system/youtube.timer.

[Unit]
Description=My Youtube Timer

[Timer]
Unit=youtube.service
OnCalendar=*-*-* 10:40:00
Persistent=True
[Install]
WantedBy=timers.target

youtube.service파일은 다음 위치에 있습니다 /etc/systemd/system/youtube.service.

[Unit]
Description=Youtube Service

[Service]
Type=simple
ExecStart=/home/deck/Desktop/youtube.sh

터미널에서 실행 하면 systemctl status youtube.timer다음을 얻습니다.

(1)(deck@steamdeck ~)$ sudo systemctl status youtube.timer
[sudo] password for deck: 
● youtube.timer - My Youtube Timer
     Loaded: loaded (/etc/systemd/system/youtube.timer; enabled; preset: disabled)
     Active: active (waiting) since Thu 2023-03-09 10:34:54 EST; 31min ago
      Until: Thu 2023-03-09 10:34:54 EST; 31min ago
    Trigger: Fri 2023-03-10 10:40:00 EST; 23h left
   Triggers: ● youtube.service

Mar 09 10:34:54 steamdeck systemd[1]: Started My Youtube Timer.
(deck@steamdeck ~)$ 

실행된다고 하는데 오전 10시 40분에 YouTube 동영상이 내 브라우저에서 열리지 않습니다. 저는 코드를 잘 다루지 못하므로 편하게 해주세요. 이 작업을 수행하는 더 쉬운 방법이 있습니까? 또한 왜 실행되지 않습니까?


글쎄, 지침에 따라 youtube.service 및 youtube.timer를 이동 /home/deck/.config/systemd/user/하고 터미널에서 다음 명령을 실행해 보았습니다.

(deck@steamdeck system)$ systemctl --user daemon-reload
(deck@steamdeck system)$ systemctl --user enable youtube.timer
(deck@steamdeck system)$ systemctl --user status youtube.timer
○ youtube.timer - My Youtube Timer
     Loaded: loaded (/home/deck/.config/systemd/user/youtube.timer; enabled; preset: enabled)
     Active: inactive (dead)
    Trigger: n/a
   Triggers: ● youtube.service

이제 분명히 트리거가 적용되지 않고 비활성 상태입니다. 활성화하려고 했는데 systemctl --user daemon-reload왜 인식하지 못합니까?

답변1

Vlastimil Burián과 PonJar가 이미 언급했듯이 스크립트의 첫 번째 줄에 오타가 있습니다.

#1/bin/env bash

해야 한다:

#!/bin/env bash

그러나 더 깊은 문제가 있습니다.

youtube.service당신은 당신을 다음과 같이 정의했습니다 .시스템 서비스이므로 기본적으로 루트로 실행됩니다. 하지만 당신은 루트로 GUI에 로그인하지 않았습니다. 그렇죠? 이렇게 해도 시스템 서비스는 기본적으로 GUI 세션을 침범하지 않습니다.

DISPLAY시스템 서비스에서 GUI에 액세스하려면 최소한 및 환경 변수를 올바르게 설정해야 합니다 XAUTHORITY. 이를 설정하는 올바른 방법은 XAUTHORITY실행 중인 X 디스플레이 관리자( gdm또는 sddm)와 현재 로그인된 GUI 세션이 있는지 여부에 따라 다릅니다.xdm<something-else>dm

따라서 먼저 pactlPulseAudio가 루트로 실행되는 PulseAudio 데몬을 찾을 수 없기 때문에 명령이 실패합니다. 왜냐하면 로그인되어 있으면 (아마도) 일반 사용자 계정으로 실행되고 있고 그렇지 않은 경우 로그인했는데 전혀 실행되지 않습니다.

그런 다음 xdg-open시스템의 기본 웹 브라우저를 시작하려고 시도 할 수 있습니다.루트 사용자로지정한 URL을 사용하세요. 하지만 기본적으로 시스템 서비스는 GUI 세션에 액세스할 수 없기 때문에 웹 브라우저가 실패합니다.

타이머와 서비스를 다음으로 설정해야 합니다.사용자 서비스, 아무것도하지 마세요시스템 서비스. 기본적으로 유닛 파일 을 /etc/systemd/system/; $HOME/.config/systemd/user/그런 다음 GUI에서 로그아웃했다가 다시 로그인하여 테스트하십시오.

시스템 서비스가 아닌 사용자 서비스를 운영하는 경우 systemctl--user옵션을 추가합니다. 그래서 systemctl --user status youtube.timer이렇게 될 것입니다 .

사용자 서비스는 자신이 속한 사용자로 실행되며 자신이 속한 GUI 세션에 자동으로 액세스할 수 있으므로 GUI 세션 내에서 작동하는 것이 크게 단순화됩니다. 반면에 로그인하지 않으면 이러한 사용자 서비스가 실행되지 않습니다.

관련 정보