AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1813020
Accepted
lenny
lenny
Asked: 2023-10-18 01:58:24 +0800 CST2023-10-18 01:58:24 +0800 CST 2023-10-18 01:58:24 +0800 CST

启动时无法运行无限运行的命令

  • 772

我想使用 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,但似乎刚刚启动服务,没有错误。

linux
  • 1 1 个回答
  • 50 Views

1 个回答

  • Voted
  1. Best Answer
    u1686_grawity
    2023-10-18T15:46:30+08:002023-10-18T15:46:30+08:00

    这看起来像是您应该作为 GUI 会话的一部分启动的东西,而不是作为系统服务。

    现在,创建*.desktop文件~/.config/autostart/是大多数图形环境支持的传统方法。最基本的此类文件如下所示:

    [桌面入口]
    类型=应用
    名称=某个应用程序
    exec=~/whatever.sh
    

    更一般的答案

    你需要运行该程序

    1. 在正确的启动阶段(或之后)——“启动”是一个过程,而不是一个瞬间,并且并非所有系统组件在同一时刻变得可用;有些设施较早可用,有些则较晚。

      没有列出任何依赖项的 systemd .service 会被分组为“在 basic.target 之后,但尽可能早”,这可能还为时过早。

      如果您的程序通过 X11 显示 GUI 窗口 - 即使它不使用 X11 进行实际录制 - 这仍然意味着它依赖于 X11 的启动,这是最后发生的事情之一;比 cron“@reboot”作业的处理晚得多。(事实上​​,X11 在您登录时就已启动,因此一般来说它甚至不算作启动过程的一部分。)

      即使程序不依赖于 X11,它也可能希望通过 /dev 访问 GPU,并且很可能某些系统服务在加载 GPU 驱动程序之前运行。(对于 GPU 驱动程序来说不太可能 - 这些驱动程序现在加载得非常早 - 但这仍然是您需要考虑的事情。)

      (而且因为它是一个 Flatpak 应用程序,所以它很可能依赖于仅在您登录时启动的各种其他用户级服务。)

      因此,每次您需要自动启动某些东西时,您都需要考虑它的依赖项是什么以及如何指定它们(在 systemd 中,有时会使用[Unit] After=和 来完成[Unit] Wants=)。

    2. 在正确的环境中——并非所有进程都在同一环境中运行;这主要特指“环境变量”,但也指更一般意义上的环境(即各种其他参数)。

      关于环境变量,您的 GUI 会话比服务拥有的内容要多得多 – 只是设置User=不会自动为您设置它们。具体来说,对于 X11,您需要DISPLAY和XAUTHORITY;对于韦兰,你需要WAYLAND_DISPLAY;对于 PulseAudio(对于选项-a),您需要XDG_RUNTIME_DIR;还有不少其他的东西要靠DBUS_SESSION_BUS_ADDRESS。这些是 GUI 风格的典型“最低限度”。

      还有其他可能组成“环境”的东西,例如用于访问控制的登录会话(即使在您的 UID 下运行的进程如果属于某个服务,也可能不会被授予相同的访问权限)。

      因此,对于需要访问任何“用户”GUI 组件的任何内容,最好从登录时已设置的 GUI 环境中启动程序 - 这样它将继承所有必需的内容,就像您的终端应用程序一样做。几乎所有台式机都支持登录时自动启动程序;上述~/.config/autostart/是最常见的方法,尽管通常还有其他一些方法。

    您对我可以尝试或检查错误消息有什么建议吗?我尝试检查journalctl,但似乎它刚刚启动服务,没有错误。

    如果journalctl没有捕获输出,请尝试在不使用该-u选项的情况下查看未过滤的日志;生命周期非常短的进程有时可能无法正确标记其相应的单元名称。

    检查systemctl restart服务是否正常工作。如果手动重新启动使其启动,则几乎可以肯定是某种“缺少依赖项”问题,如前所述。

    用于systemd-run从终端创建并启动动态服务;这有一个小优点,因为您可以使用--pipe甚至--pty直接将服务的输出附加到您的终端(这对于常规服务来说是不可能的),同时仍然通过 systemd 启动该进程。这可能会显示原本不会显示的错误消息。

    • 2

相关问题

  • 如何让我的 Linux 机器看起来像是在运行 Windows?

  • 对于 cp 或 mv,是否有等同于 cd - 的东西?

  • 以 root 身份运行 docker 容器

  • 如何在域和 Linux 活动目录中启用指纹传感器

  • 如何在CentOS 7 中将Ctrl+C 永久更改为Ctrl+K?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    Vickel Firefox 不再允许粘贴到 WhatsApp 网页中? 2023-08-18 05:04:35 +0800 CST
  • Martin Hope
    Saaru Lindestøkke 为什么使用 Python 的 tar 库时 tar.xz 文件比 macOS tar 小 15 倍? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve