我想使用 GPU 屏幕录像机来录制重播。我使用 flatpak 安装它,并使用以下命令启动重播模式:
flatpak run --command=gpu-screen-recorder com.dec05eba.gpu_screen_recorder -w DP-1 -f 60 -o ~/Videos/Captures -c mp4 -r 150 -a alsa_output.usb-BEHRINGER_UMC202HD_192k-00.HiFi__hw_U192k__sink.monitor
此进程会占用当前终端。
由于我不希望阻塞的终端窗口不断运行,并且我想让它在启动时启动,因此我创建了一个~/scripts/startup/gpu-recorder-flatpak-command.sh
要在启动时运行的脚本。该脚本是可执行的并且有一个shebang。如果我只是在终端中输入文件名,它就会按预期工作。这意味着,我可以在另一个终端中发送命令 ( killall -SIGUSR1 gpu-screen-recorder
),并将过去 2.5 分钟的视频保存到指定位置。
现在,为了让它在启动时启动,我尝试使用 cron 并尝试创建自己的 systemd 服务。
为了使用 cron,我尝试使用crontab -e
放入@reboot ~/scripts/startup/gpu-recorder-flatpak-command.sh
cronjob 文件。我也尝试过 put @reboot sleep 10; ~/scripts/startup/gpu-recorder-flatpak-command.sh
,但这似乎没有改变任何东西。
当 cron 不起作用时,我并没有真正检查原因,我只是转到了 systemd 路线。我的服务文件位于/etc/systemd/system/gpu-screen-replay.service
,其中包含以下内容:
[Unit]
Description=GPU screen record replay service
After=network.target
[Service]
Type=simple
Restart=always
RestartSec=1
User=lenny
ExecStart=/home/meekah/scripts/startup/gpu-recorder-flatpak-command.sh
[Install]
WantedBy=multi-user.target
我确实执行了systemctl enable gpu-screen-replay.service
,并且在运行时systemctl
我的服务被列为loaded active running
.
您对我可以尝试或检查错误消息有什么建议吗?我尝试检查journalctl
,但似乎刚刚启动服务,没有错误。
这看起来像是您应该作为 GUI 会话的一部分启动的东西,而不是作为系统服务。
现在,创建
*.desktop
文件~/.config/autostart/
是大多数图形环境支持的传统方法。最基本的此类文件如下所示:更一般的答案
你需要运行该程序
在正确的启动阶段(或之后)——“启动”是一个过程,而不是一个瞬间,并且并非所有系统组件在同一时刻变得可用;有些设施较早可用,有些则较晚。
没有列出任何依赖项的 systemd .service 会被分组为“在 basic.target 之后,但尽可能早”,这可能还为时过早。
如果您的程序通过 X11 显示 GUI 窗口 - 即使它不使用 X11 进行实际录制 - 这仍然意味着它依赖于 X11 的启动,这是最后发生的事情之一;比 cron“@reboot”作业的处理晚得多。(事实上,X11 在您登录时就已启动,因此一般来说它甚至不算作启动过程的一部分。)
即使程序不依赖于 X11,它也可能希望通过 /dev 访问 GPU,并且很可能某些系统服务在加载 GPU 驱动程序之前运行。(对于 GPU 驱动程序来说不太可能 - 这些驱动程序现在加载得非常早 - 但这仍然是您需要考虑的事情。)
(而且因为它是一个 Flatpak 应用程序,所以它很可能依赖于仅在您登录时启动的各种其他用户级服务。)
因此,每次您需要自动启动某些东西时,您都需要考虑它的依赖项是什么以及如何指定它们(在 systemd 中,有时会使用
[Unit] After=
和 来完成[Unit] Wants=
)。在正确的环境中——并非所有进程都在同一环境中运行;这主要特指“环境变量”,但也指更一般意义上的环境(即各种其他参数)。
关于环境变量,您的 GUI 会话比服务拥有的内容要多得多 – 只是设置
User=
不会自动为您设置它们。具体来说,对于 X11,您需要DISPLAY
和XAUTHORITY
;对于韦兰,你需要WAYLAND_DISPLAY
;对于 PulseAudio(对于选项-a
),您需要XDG_RUNTIME_DIR
;还有不少其他的东西要靠DBUS_SESSION_BUS_ADDRESS
。这些是 GUI 风格的典型“最低限度”。还有其他可能组成“环境”的东西,例如用于访问控制的登录会话(即使在您的 UID 下运行的进程如果属于某个服务,也可能不会被授予相同的访问权限)。
因此,对于需要访问任何“用户”GUI 组件的任何内容,最好从登录时已设置的 GUI 环境中启动程序 - 这样它将继承所有必需的内容,就像您的终端应用程序一样做。几乎所有台式机都支持登录时自动启动程序;上述
~/.config/autostart/
是最常见的方法,尽管通常还有其他一些方法。如果journalctl没有捕获输出,请尝试在不使用该
-u
选项的情况下查看未过滤的日志;生命周期非常短的进程有时可能无法正确标记其相应的单元名称。检查
systemctl restart
服务是否正常工作。如果手动重新启动使其启动,则几乎可以肯定是某种“缺少依赖项”问题,如前所述。用于
systemd-run
从终端创建并启动动态服务;这有一个小优点,因为您可以使用--pipe
甚至--pty
直接将服务的输出附加到您的终端(这对于常规服务来说是不可能的),同时仍然通过 systemd 启动该进程。这可能会显示原本不会显示的错误消息。