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
    • 最新
    • 标签
主页 / unix / 问题 / 760082
Accepted
Mathias Sven
Mathias Sven
Asked: 2023-10-29 01:43:40 +0800 CST2023-10-29 01:43:40 +0800 CST 2023-10-29 01:43:40 +0800 CST

在系统设置事件中运行显示相关命令

  • 772

我正在开发一个 systemd/udev 设置,我想在上游共享它,但是我无法让它以非 hacky 的方式工作。本质上,我将此脚本作为 systemd 服务的执行程序:

      ICON="somepath/dslr-camera-white.png"

      function on-display() {
          local sdisplay=$(echo $XDG_SESSION_TYPE)
          if [ "$sdisplay" == "wayland" ]; then
          local display=":$(echo $WAYLAND_DISPLAY)"
          else
          local display=":$(ls /tmp/.X11-unix/* | sed 's#/tmp/.X11-unix/X##' | head -n 1)"
          fi
          
          local user=$(who | grep '('$display')' | awk '{print $1}' | head -n 1)

          local uid=$(id -u $user)

          sudo -u $user DISPLAY=$display DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$uid/bus "$@"
      }

      cleanup() {
          on-display notify-send -i $ICON "Disconnected" "The DSLR Camera has been turned off." --app-name="DSLR Webcam"
          trap - SIGTERM && kill -- -$$
      }

      trap cleanup SIGINT SIGTERM EXIT

      on-display notify-send -i $ICON "Connected" "The DSLR Camera has been turned on and it is ready to use." --app-name="DSLR Webcam"
      on-display yad --window-icon=$ICON --image=$ICON --no-buttons --title="DSLR Webcam" --notification --listen &

      output=$(v4l2-ctl --list-devices)
      line=$(echo "$output" | grep "Virtual Camera")
      vdevice=$(echo "$output" | sed -n "/$line/{n;s/^\t\+//p;}")
      gphoto2 --stdout --capture-movie | ffmpeg -i - -vcodec rawvideo -pix_fmt yuv420p -threads 0 -f v4l2 $vdevice

该服务的要点是当插入特定的 gphoto2 支持的相机时由 udev 规则启动,因此我有这些 udev 规则:

ACTION=="add", ATTR{idVendor}=="04a9", ATTR{idProduct}=="3218", RUN+="systemctl start dslr-webcam.service"
ACTION=="remove", ATTR{idVendor}=="04a9", ATTR{idProduct}=="3218", RUN+="systemctl stop dslr-webcam.service"

到目前为止,“好吧”,因为我已经阅读了使用RUNsystemd 服务的替代方案,但无论如何......这里的问题具体是对yad.

yad是一个允许您从 CLI 显示对话框的程序,我利用它来制作系统图标,因为我希望在相机处于活动状态时显示一个系统图标。

问题

与 不同notify-send,它可能在一些常见的套接字上工作,yad需要适当的XAUTHORITY设置才能工作,否则你会得到cannot open display: :0。在我的例子中,黑客解决方案是简单地将其设置为正确的 Xauthority,因为我使用的是 SDDM(显示管理器),它驻留在目录中/tmp,因此我可以将其添加到脚本中:

XAUTHORITY=$(ls /tmp/xauth*)

然后它就起作用了……但这很糟糕,它做了很多假设,事实上整个on-display函数似乎也是一个坏主意。如果我把它带到不同的系统,它可能不会工作,因为适当的 Xauthority 可能在无数的地方,而且我什至还没有尝试过 Wayland(我将把它留到以后)。

关于什么xauth

我以为我可以以某种方式xauth用来检索正确的 Xauthority,但情况似乎并非如此...这个脚本是一个系统服务,所以我xauth info返回Authority file: /root/.xauthWV7OfU,并以正确的用户身份运行它sudo -u $user xauth info给我Authority file: /home/myuser/.Xauthority,但这些都不起作用当给予yad. 正确的XAUTHORITY设置是由显示管理器设置的,所以我想我只能从它的子进程中获取它。

我也尝试了这个答案给出的所有方法,但是第一个方法不起作用,因为XAUTHORITY实际上不在系统环境中,而第二个方法(除了提到的陷阱)不起作用,它说xauth 文件位于/run/sddm/xauth_KvyuHd,但尝试使用它不起作用,因此它与 xauth 文件不同/tmp/xauth_FzoQqz

从与上一个相同的问题来看,这种方法似乎有效,但我不知道它的便携性如何。而且看起来仍然很老套。


作为用户服务运行

也许这是最有前途的一个,因为该脚本中没有任何内容阻止它作为用户运行(它也摆脱了on-display),我确实尝试了这种方法,而如果相机已插入并且我运行systemctl --user start dslr-webcam.service它就会工作正如预期的那样(包括yad),现在我对规则有疑问udev。我搜索了很多地方,包括这里,但我找不到如何从udev规则运行 systemd 用户服务,对我来说这也没有任何意义,如何udev知道要使用哪个用户?

systemd
  • 1 1 个回答
  • 18 Views

1 个回答

  • Voted
  1. Best Answer
    telcoM
    2023-10-29T02:48:39+08:002023-10-29T02:48:39+08:00

    您不直接从 udev 规则运行用户服务;相反,您应该让 udev 告诉 systemd 该设备需要运行特定的用户服务。

    像TAG+="systemd", ENV{SYSTEMD_USER_WANTS}="dslr-webcam.service"这样:

    ACTION=="add", ATTR{idVendor}=="04a9", ATTR{idProduct}=="3218". TAG+="systemd", ENV{SYSTEMD_USER_WANTS}="dslr-webcam.service"
    ACTION=="remove", ATTR{idVendor}=="04a9", ATTR{idProduct}=="3218", TAG+="systemd", ENV{SYSTEMD_USER_WANTS}="dslr-webcam.service"
    

    由于您dslr-webcam.service需要 GUI 访问,因此它应该将自己声明为BindsTo=graphical-session.target和After=graphical-session.target。当以这种方式声明时,服务应该自动获取正确的 DISPLAY 和 XAUTHORITY 变量。

    顺便说一下,感谢您分享您的想法;它给了我灵感去建立一些非常相似的东西......

    • 1

相关问题

  • journalctl 中的区分级别

  • 将默认编辑器更改为 vim for _ sudo systemctl edit [unit-file] _

  • systemd:如何在服务启动时运行脚本,而不编辑服务定义

  • 使用 systemd 看门狗支持重新启动应用程序

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

Sidebar

Stats

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

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve