システムタイマーが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あなたはあなたを次のように定義しました。システムサービスそのため、デフォルトではrootとして実行されます。しかし、あなたはrootとしてGUIにログインしていません。そうですか?これにより、システムサービスはデフォルトでGUIセッションに侵入しません。

DISPLAYシステムサービスからGUIにアクセスするには、少なくとも変数と環境変数を正しく設定する必要がありますXAUTHORITY。これを設定する正しい方法は、XAUTHORITY実行中のXディスプレイマネージャ(gdmまたはsddm)と現在ログインしているGUIセッションがあるかどうかによって異なります。xdm<something-else>dm

したがって、まず、pactlPulseAudio が root として実行される PulseAudio デーモンが見つからないため、コマンドは失敗します。なぜなら、ログインしている場合(おそらく)、通常のユーザーアカウントで実行されています。そうでない場合はログインしましたが、まったく実行されません。

その後、xdg-openシステムのデフォルトのWebブラウザを起動しようとすることができます。rootユーザーとして指定したURLを使用してください。ただし、デフォルトではシステムサービスはGUIセッションにアクセスできないため、Webブラウザは失敗します。

タイマーとサービスを次のように設定する必要があります。ユーザーサービス、何もしないでくださいシステムサービス。基本的にユニットファイルを/etc/systemd/system/$HOME/.config/systemd/user/次に、GUIからログアウトして再度ログインしてテストします。

システムサービスではなくユーザーサービスを実行している場合は、systemctlこの--userオプションを追加します。だからsystemctl --user status youtube.timerこうなるでしょう。

ユーザーサービスは自分が属するユーザーとして実行され、自分が属するGUIセッションに自動的にアクセスできるため、GUIセッション内での作業が大幅に簡素化されます。一方、ログインしないと、これらのユーザーサービスは実行されません。

おすすめ記事