为什么我的 systemd 计时器不执行我的 sh 脚本?

为什么我的 systemd 计时器不执行我的 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和环境变量才能从系统服务XAUTHORITY访问 GUI,正确的设置方法XAUTHORITY取决于您正在运行的 X 显示管理器(gdmsddm或),以及当前是否有登录的 GUI 会话。xdm<something-else>dm

因此,首先,该pactl命令将失败,因为 PulseAudio 找不到以 root 身份运行的 PulseAudio 守护进程...因为如果您登录,它(可能)以您的普通用户帐户运行,如果您没有登录,则根本不运行。

然后,xdg-open可能会尝试启动系统默认的网络浏览器作为根用户使用您指定的 URL...但由于默认情况下系统服务无法访问任何 GUI 会话,因此 Web 浏览器将失败。

您应该将计时器和服务设置为用户服务,不作为系统服务。基本上,您不应将单元文件放入/etc/systemd/system/,而应将它们放入$HOME/.config/systemd/user/。然后从 GUI 注销并重新登录进行测试。

当用于systemctl操作用户服务而不是系统服务时,请添加该--user选项。所以会是systemctl --user status youtube.timer这样。

用户服务以其所属的用户身份运行,并且将自动访问它们所属的 GUI 会话,这将大大简化在 GUI 会话中进行操作的尝试。另一方面是,如果您未登录,这些用户服务将不会运行。

相关内容