Systemd:DISPLAY、XAUTHORITY 变量不足以在 Wayland 中启动图形对话

pre*_*ise 8 command-line wayland udev systemd

每次具有 SMART 功能的特定设备插入 USB 端口时,我都会在systemd .conf文件中使用以下内容来运行图形对话框。zenity这在使用显示服务器的 Xubuntu 中工作正常,但在WaylandX服务器中对话框显示zenity失败。

\n
USER=myName\nDISPLAY=:0.0\nWAYLAND_DISPLAY=wayland-0\nXAUTHORITY=/home/myName/.Xauthority\nHOME=/home/myName\nSHELL=/bin/bash\n
Run Code Online (Sandbox Code Playgroud)\n

我尝试在 Ubuntu 23.10 中添加WAYLAND_DISPLAY=wayland-0Wayland服务器的.confzenity文件,但对话仍然无法显示。我还需要做什么?

\n
\n

我的setup-01的文件列表:

\n
/bin/hdd_smart_dump_on_usb_trigger.sh\n/etc/00_hdd_smart_dump_on_usb_trigger.conf\n/etc/systemd/system/hdd_smart_dump_on_usb_trigger@.service\n/etc/systemd/system/hdd_smart_dump_on_usb_trigger@.service.d/disable_manual_start.conf\n/etc/systemd/system/hdd_smart_dump_on_usb_trigger@.target\n/etc/udev/00_hdd_smart_dump_on_usb_trigger.udev.sh\n/etc/udev/rules.d/99-hdd-smart-dump-on-usb-trigger.udev.rules\n
Run Code Online (Sandbox Code Playgroud)\n

内容/etc/00_hdd_smart_dump_on_usb_trigger.conf

\n
USER=myName\nDISPLAY=:0.0\nWAYLAND_DISPLAY=wayland-0\nXAUTHORITY=/home/ajthapa/.Xauthority\nHOME=/home/myName\nSHELL=/bin/bash\n
Run Code Online (Sandbox Code Playgroud)\n

内容/etc/systemd/system/hdd_smart_dump_on_usb_trigger@.service

\n
[Unit]\nDescription=HDD SMART Dump on USB Trigger - service unit for %I\nDocumentation=man:systemd.unit(5) man:systemd.exec(5) man:systemd.special(7) man:systemd.target(5)\nConditionPathExistsGlob=/sys/class/block/sd*\n# RefuseManualStart=true\n# RefuseManualStop=true\n\n[Service]\nEnvironmentFile=/etc/00_hdd_smart_dump_on_usb_trigger.conf\nExecStart=-/bin/bash -c '/bin/hdd_smart_dump_on_usb_trigger.sh -d %i -t "start_of_session"'\n
Run Code Online (Sandbox Code Playgroud)\n

内容/etc/systemd/system/hdd_smart_dump_on_usb_trigger@.service.d/disable_manual_start.conf

\n
[Unit]\n## Allow only to be started/stopped by device events; if manual start is needed\n## you should instead call the script which this service calls.\nRefuseManualStart=true\nRefuseManualStop=true\n
Run Code Online (Sandbox Code Playgroud)\n

内容/etc/systemd/system/hdd_smart_dump_on_usb_trigger@.target

\n
[Unit]\nDescription=HDD SMART Dump on USB Trigger - target unit for %I\nDocumentation=man:systemd.unit(5) man:systemd.target(5) man:systemd.special(7)\nStopWhenUnneeded=yes\nRequires=hdd_smart_dump_on_usb_trigger@%i.service\nBefore=hdd_smart_dump_on_usb_trigger@%i.service\nBindsTo=%i.device\nRefuseManualStart=true\nRefuseManualStop=true\n
Run Code Online (Sandbox Code Playgroud)\n

内容/etc/udev/rules.d/99-hdd-smart-dump-on-usb-trigger.udev.rules

\n
SUBSYSTEM!="block", GOTO="label__hdd_smart_dump_on_usb_trigger_rules_end"\nKERNEL!="sd*", GOTO="label__hdd_smart_dump_on_usb_trigger_rules_end"\nENV{DEVTYPE}!="disk", GOTO="label__hdd_smart_dump_on_usb_trigger_rules_end"\n\n## Rules to match specific devices; start:\nATTRS{idProduct}=="2312", ATTRS{idVendor}=="0bc2", GOTO="label__enlisted_devices"\nATTRS{idProduct}=="5590", ATTRS{idVendor}=="0781", GOTO="label__enlisted_devices"\nATTRS{idProduct}!="2312|5590", ATTRS{idVendor}!="0bc2|0781", GOTO="label__hdd_smart_dump_on_usb_trigger_rules_end"\n## Rules to match specific devices; end.\n\nLABEL="label__enlisted_devices"\nACTION=="remove", GOTO="label__hdd_smart_dump_on_usb_trigger_rules_for_action_remove"\nACTION!="add", GOTO="label__hdd_smart_dump_on_usb_trigger_rules_end"\nACTION=="add", SUBSYSTEM=="block", KERNEL=="sd*", ENV{DEVTYPE}=="disk", ATTRS{idProduct}=="2312", ATTRS{idVendor}=="0bc2", TAG+="systemd", ENV{SYSTEMD_WANTS}+="hdd_smart_dump_on_usb_trigger@dev-%k.target", RUN+="/etc/udev/00_hdd_smart_dump_on_usb_trigger.udev.sh ==01== UDEV_ACTION==ADD ####  ENVIRONMENT::::[[ DEVNAME=$env{DEVNAME} | DEVPATH=$env{DEVPATH} | ID_MODEL=$env{ID_MODEL} | ID_SERIAL=$env{ID_SERIAL} | ID_SERIAL_SHORT=$env{ID_SERIAL_SHORT} | ID_VENDOR=$env{ID_VENDOR} | TAGS=$env{TAGS} | ID_ATA=$env{ID_ATA} | ID_ATA_FEATURE_SET_SMART=$env{ID_ATA_FEATURE_SET_SMART} | ID_ATA_FEATURE_SET_SMART_ENABLED=$env{ID_ATA_FEATURE_SET_SMART_ENABLED} | ID_ATA_SATA=$env{ID_ATA_SATA} | ID_ATA_WRITE_CACHE=$env{ID_ATA_WRITE_CACHE} | ID_ATA_WRITE_CACHE_ENABLED=$env{ID_ATA_WRITE_CACHE_ENABLED} | ID_VENDOR_ID=$env{ID_VENDOR_ID} | ID_MODEL_ID=$env{ID_MODEL_ID} | ]]  ####  ATTRIBUTE::::[[ size=$attr{size} | KERNEL=%k | idProduct=$attr{idProduct} | idVendor=$attr{idVendor} | manufacturer=$attr{manufacturer} | product=$attr{product} | removable=$attr{removable} | bMaxPower=$attr{bMaxPower} | ]]", GOTO="label__hdd_smart_dump_on_usb_trigger_rules_end"\nACTION=="add", SUBSYSTEM=="block", KERNEL=="sd*", ENV{DEVTYPE}=="disk", ATTRS{idProduct}=="5590", ATTRS{idVendor}=="0781", TAG+="systemd", ENV{SYSTEMD_WANTS}+="hdd_smart_dump_on_usb_trigger@dev-%k.target", RUN+="/etc/udev/00_hdd_smart_dump_on_usb_trigger.udev.sh ==01== UDEV_ACTION==ADD ####  ENVIRONMENT::::[[ DEVNAME=$env{DEVNAME} | DEVPATH=$env{DEVPATH} | ID_MODEL=$env{ID_MODEL} | ID_SERIAL=$env{ID_SERIAL} | ID_SERIAL_SHORT=$env{ID_SERIAL_SHORT} | ID_VENDOR=$env{ID_VENDOR} | TAGS=$env{TAGS} | ID_ATA=$env{ID_ATA} | ID_ATA_FEATURE_SET_SMART=$env{ID_ATA_FEATURE_SET_SMART} | ID_ATA_FEATURE_SET_SMART_ENABLED=$env{ID_ATA_FEATURE_SET_SMART_ENABLED} | ID_ATA_SATA=$env{ID_ATA_SATA} | ID_ATA_WRITE_CACHE=$env{ID_ATA_WRITE_CACHE} | ID_ATA_WRITE_CACHE_ENABLED=$env{ID_ATA_WRITE_CACHE_ENABLED} | ID_VENDOR_ID=$env{ID_VENDOR_ID} | ID_MODEL_ID=$env{ID_MODEL_ID} | ]]  ####  ATTRIBUTE::::[[ size=$attr{size} | KERNEL=%k | idProduct=$attr{idProduct} | idVendor=$attr{idVendor} | manufacturer=$attr{manufacturer} | product=$attr{product} | removable=$attr{removable} | bMaxPower=$attr{bMaxPower} | ]]", GOTO="label__hdd_smart_dump_on_usb_trigger_rules_end"\nLABEL="label__hdd_smart_dump_on_usb_trigger_rules_for_action_remove"\nACTION=="remove", SUBSYSTEM=="block", KERNEL=="sd*", ENV{DEVTYPE}=="disk", RUN+="/etc/udev/00_hdd_smart_dump_on_usb_trigger.udev.sh ==02== UDEV_ACTION==REMOVE ####  ENVIRONMENT::::[[ DEVNAME=$env{DEVNAME} | ID_MODEL=$env{ID_MODEL} | ID_SERIAL=$env{ID_SERIAL} | ID_SERIAL_SHORT=$env{ID_SERIAL_SHORT} | ID_VENDOR=$env{ID_VENDOR} | TAGS=$env{TAGS} | ID_ATA=$env{ID_ATA} | ID_ATA_FEATURE_SET_SMART=$env{ID_ATA_FEATURE_SET_SMART} | ID_ATA_FEATURE_SET_SMART_ENABLED=$env{ID_ATA_FEATURE_SET_SMART_ENABLED} | ID_ATA_SATA=$env{ID_ATA_SATA} | ID_ATA_WRITE_CACHE=$env{ID_ATA_WRITE_CACHE} | ID_ATA_WRITE_CACHE_ENABLED=$env{ID_ATA_WRITE_CACHE_ENABLED} | ID_VENDOR_ID=$env{ID_VENDOR_ID} | ID_MODEL_ID=$env{ID_MODEL_ID} ]]  ####  ATTRIBUTE::::[[ size=$attr{size} | KERNEL=$kernel | idProduct=$attr{idProduct} | idVendor=$attr{idVendor} | manufacturer=$attr{manufacturer} | product=$attr{product} | model=$attr{model} | removable=$attr{removable} ]]"\nLABEL="label__hdd_smart_dump_on_usb_trigger_rules_end"\n
Run Code Online (Sandbox Code Playgroud)\n

包含/etc/udev/rules.d/99-hdd-smart-dump-on-usb-trigger.udev.rules匹配特定设备集的规则,它在这些设备上执行,/etc/udev/00_hdd_smart_dump_on_usb_trigger.udev.sh然后将一些属性写入/var/run/目录中的文件。规则文件还会触发 systemd 单元文件,然后执行/bin/hdd_smart_dump_on_usb_trigger.sh. 该脚本使用 zenity 允许用户将输出保存smartmontools到选定的位置。

\n

更新:

\n

设置-02:

\n

文件列表:

\n
-rw-r--r-- 1 root root 3018 Feb 19 12:25 /etc/00_hdd_smart_dump_on_usb_trigger.conf\n-rw-r--r-- 1 root root 2013 Feb 19 12:15 /etc/systemd/system/hdd_smart_dump_on_usb_trigger@.service\n-rw-r--r-- 1 root root 196 Aug  8  2020 /etc/systemd/system/hdd_smart_dump_on_usb_trigger@.service.d/disable_manual_start.conf\n-rw-r--r-- 1 root root 573 Feb 19 07:42 /etc/systemd/system/hdd_smart_dump_on_usb_trigger@.target\n-rwxr-xr-x 1 root root 7562 Sep  5  2020 /etc/udev/00_hdd_smart_dump_on_usb_trigger.udev.sh\n-rw-r--r-- 1 root root 7710 Feb 19 13:29 /etc/udev/rules.d/99-hdd-smart-dump-on-usb-trigger.udev.rules\n-rwxr-xr-x 1 root root 5032 Feb 19 13:18 /opt/hdd_smart_dump_on_usb_trigger/bin/hdd_smart_dump_display_with_zenity.sh\n-rwxr-xr-x 1 root root 34594 Feb 19 11:58 /opt/hdd_smart_dump_on_usb_trigger/bin/hdd_smart_dump_on_usb_trigger.sh\n-rw-r--r-- 1 myName myName 502 Feb 19 13:30 /home/myName/.config/systemd/user/hdd_smart_dump_display_using_zenity@.service\n
Run Code Online (Sandbox Code Playgroud)\n

通过此设置,udev 写入属性,然后由我的 systemd 系统单元读取,但我的 systemd 用户单元无法启动并在 zenity 对话中显示转储。我可以在 my 中使用相同的命令/home/myName/.config/systemd/user/hdd_smart_dump_display_using_zenity@.service通过 SMART 转储启动 zenity。因此,问题可能出在我的 udev .rules 文件和/或我的 systemd 用户单元文件和/或其命名中。

\n

内容/home/myName/.config/systemd/user/hdd_smart_dump_display_using_zenity@.service

\n
[Unit]\nDescription=HDD SMART Dump Display Using Zenity Dialogue\nDocumentation=man:systemd.unit(5) man:systemd.exec(5) man:systemd.special(7) man:systemd.target(5)\nRequires=hdd_smart_dump_on_usb_trigger@%i.service\nAfter=hdd_smart_dump_on_usb_trigger@%i.service\nConditionPathExistsGlob=/sys/class/block/sd*\n# RefuseManualStart=true\n# RefuseManualStop=true\n\n[Service]\nType=oneshot\nExecStart=-/bin/bash -c '/opt/hdd_smart_dump_on_usb_trigger/bin/hdd_smart_dump_display_with_zenity.sh --display-dialogue'\n
Run Code Online (Sandbox Code Playgroud)\n

内容/etc/udev/rules.d/99-hdd-smart-dump-on-usb-trigger.udev.rules

\n
SUBSYSTEM!="block", GOTO="label__hdd_smart_dump_on_usb_trigger_rules_end"\nKERNEL!="sd*", GOTO="label__hdd_smart_dump_on_usb_trigger_rules_end"\nENV{DEVTYPE}!="disk", GOTO="label__hdd_smart_dump_on_usb_trigger_rules_end"\nATTRS{idProduct}=="2312", ATTRS{idVendor}=="0bc2", GOTO="label__enlisted_devices"\nATTRS{idProduct}=="5590", ATTRS{idVendor}=="0781", GOTO="label__enlisted_devices"\nATTRS{idProduct}!="2312|5590", ATTRS{idVendor}!="0bc2|0781", GOTO="label__hdd_smart_dump_on_usb_trigger_rules_end"\nLABEL="label__enlisted_devices"\nACTION=="remove", GOTO="label__hdd_smart_dump_on_usb_trigger_rules_for_action_remove"\nACTION!="add", GOTO="label__hdd_smart_dump_on_usb_trigger_rules_end"\nACTION=="add", SUBSYSTEM=="block", KERNEL=="sd*", ENV{DEVTYPE}=="disk", ATTRS{idProduct}=="2312", ATTRS{idVendor}=="0bc2", TAG+="systemd", ENV{SYSTEMD_WANTS}+="hdd_smart_dump_on_usb_trigger@dev-%k.target", ENV{SYSTEMD_USER_WANTS}+="hdd_smart_dump_display_using_zenity@dev-%k.system", RUN+="/etc/udev/00_hdd_smart_dump_on_usb_trigger.udev.sh ==01== UDEV_ACTION==ADD ####  ENVIRONMENT::::[[ DEVNAME=$env{DEVNAME} | DEVPATH=$env{DEVPATH} | ID_MODEL=$env{ID_MODEL} | ID_SERIAL=$env{ID_SERIAL} | ID_SERIAL_SHORT=$env{ID_SERIAL_SHORT} | ID_VENDOR=$env{ID_VENDOR} | TAGS=$env{TAGS} | ID_ATA=$env{ID_ATA} | ID_ATA_FEATURE_SET_SMART=$env{ID_ATA_FEATURE_SET_SMART} | ID_ATA_FEATURE_SET_SMART_ENABLED=$env{ID_ATA_FEATURE_SET_SMART_ENABLED} | ID_ATA_SATA=$env{ID_ATA_SATA} | ID_ATA_WRITE_CACHE=$env{ID_ATA_WRITE_CACHE} | ID_ATA_WRITE_CACHE_ENABLED=$env{ID_ATA_WRITE_CACHE_ENABLED} | ID_VENDOR_ID=$env{ID_VENDOR_ID} | ID_MODEL_ID=$env{ID_MODEL_ID} | ]]  ####  ATTRIBUTE::::[[ size=$attr{size} | KERNEL=%k | idProduct=$attr{idProduct} | idVendor=$attr{idVendor} | manufacturer=$attr{manufacturer} | product=$attr{product} | removable=$attr{removable} | bMaxPower=$attr{bMaxPower} | ]]", GOTO="label__hdd_smart_dump_on_usb_trigger_rules_end"\nACTION=="add", SUBSYSTEM=="block", KERNEL=="sd*", ENV{DEVTYPE}=="disk", ATTRS{idProduct}=="5590", ATTRS{idVendor}=="0781", TAG+="systemd", ENV{SYSTEMD_WANTS}+="hdd_smart_dump_on_usb_trigger@dev-%k.target", ENV{SYSTEMD_USER_WANTS}+="hdd_smart_dump_display_using_zenity@dev-%k.system", RUN+="/etc/udev/00_hdd_smart_dump_on_usb_trigger.udev.sh ==01== UDEV_ACTION==ADD ####  ENVIRONMENT::::[[ DEVNAME=$env{DEVNAME} | DEVPATH=$env{DEVPATH} | ID_MODEL=$env{ID_MODEL} | ID_SERIAL=$env{ID_SERIAL} | ID_SERIAL_SHORT=$env{ID_SERIAL_SHORT} | ID_VENDOR=$env{ID_VENDOR} | TAGS=$env{TAGS} | ID_ATA=$env{ID_ATA} | ID_ATA_FEATURE_SET_SMART=$env{ID_ATA_FEATURE_SET_SMART} | ID_ATA_FEATURE_SET_SMART_ENABLED=$env{ID_ATA_FEATURE_SET_SMART_ENABLED} | ID_ATA_SATA=$env{ID_ATA_SATA} | ID_ATA_WRITE_CACHE=$env{ID_ATA_WRITE_CACHE} | ID_ATA_WRITE_CACHE_ENABLED=$env{ID_ATA_WRITE_CACHE_ENABLED} | ID_VENDOR_ID=$env{ID_VENDOR_ID} | ID_MODEL_ID=$env{ID_MODEL_ID} | ]]  ####  ATTRIBUTE::::[[ size=$attr{size} | KERNEL=%k | idProduct=$attr{idProduct} | idVendor=$attr{idVendor} | manufacturer=$attr{manufacturer} | product=$attr{product} | removable=$attr{removable} | bMaxPower=$attr{bMaxPower} | ]]", GOTO="label__hdd_smart_dump_on_usb_trigger_rules_end"\nLABEL="label__hdd_smart_dump_on_usb_trigger_rules_for_action_remove"\nACTION=="remove", SUBSYSTEM=="block", KERNEL=="sd*", ENV{DEVTYPE}=="disk", RUN+="/etc/udev/00_hdd_smart_dump_on_usb_trigger.udev.sh ==02== UDEV_ACTION==REMOVE ####  ENVIRONMENT::::[[ DEVNAME=$env{DEVNAME} | ID_MODEL=$env{ID_MODEL} | ID_SERIAL=$env{ID_SERIAL} | ID_SERIAL_SHORT=$env{ID_SERIAL_SHORT} | ID_VENDOR=$env{ID_VENDOR} | TAGS=$env{TAGS} | ID_ATA=$env{ID_ATA} | ID_ATA_FEATURE_SET_SMART=$env{ID_ATA_FEATURE_SET_SMART} | ID_ATA_FEATURE_SET_SMART_ENABLED=$env{ID_ATA_FEATURE_SET_SMART_ENABLED} | ID_ATA_SATA=$env{ID_ATA_SATA} | ID_ATA_WRITE_CACHE=$env{ID_ATA_WRITE_CACHE} | ID_ATA_WRITE_CACHE_ENABLED=$env{ID_ATA_WRITE_CACHE_ENABLED} | ID_VENDOR_ID=$env{ID_VENDOR_ID} | ID_MODEL_ID=$env{ID_MODEL_ID} ]]  ####  ATTRIBUTE::::[[ size=$attr{size} | KERNEL=$kernel | idProduct=$attr{idProduct} | idVendor=$attr{idVendor} | manufacturer=$attr{manufacturer} | product=$attr{product} | model=$attr{model} | removable=$attr{removable} ]]"\nLABEL="label__hdd_smart_dump_on_usb_trigger_rules_end"\n
Run Code Online (Sandbox Code Playgroud)\n

sudo systemctl --no-pager -l status 'hdd_smart_dump_on_usb_trigger*'插入USB设备的输出:

\n
\xe2\x97\x8f hdd_smart_dump_on_usb_trigger@dev-sdb.target - HDD SMART Dump on USB Trigger - target unit for dev/sdb\n     Loaded: loaded (/etc/systemd/system/hdd_smart_dump_on_usb_trigger@.target; static)\n     Active: active since Mon 2024-02-19 14:17:50 +0545; 2min 24s ago\n       Docs: man:systemd.unit(5)\n             man:systemd.target(5)\n             man:systemd.special(7)\n\nFeb 19 14:17:50 ajthapa-vcomputer systemd[1]: Reached target hdd_smart_dump_on_usb_trigger@dev-sdb.target - HDD SMART Dump on USB Trigger - target unit for dev/sdb.\n
Run Code Online (Sandbox Code Playgroud)\n

没有 的输出systemctl --user --no-pager -l status 'hdd_*'

\n

设置-03:

\n

文件:

\n
/etc/00_hdd_smart_dump_on_usb_trigger.conf\n/etc/systemd/system/hdd_smart_dump_on_usb_trigger@.service\n/etc/systemd/system/hdd_smart_dump_on_usb_trigger@.service.d/disable_manual_start.conf\n/etc/systemd/system/hdd_smart_dump_on_usb_trigger@.target\n/etc/udev/00_hdd_smart_dump_on_usb_trigger.udev.sh\n/etc/udev/rules.d/99-hdd-smart-dump-on-usb-trigger.udev.rules\n/opt/hdd_smart_dump_on_usb_trigger/bin/hdd_smart_dump_display_with_zenity.sh\n/opt/hdd_smart_dump_on_usb_trigger/bin/hdd_smart_dump_on_usb_trigger.sh\n/home/ajthapa/.config/systemd/user/hdd_smart_dump_display_using_zenity.service\n
Run Code Online (Sandbox Code Playgroud)\n

内容/home/ajthapa/.config/systemd/user/hdd_smart_dump_display_using_zenity.service

\n
[Unit]\nDescription=HDD SMART Dump Display Using Zenity Dialogue\nDocumentation=man:systemd.unit(5) man:systemd.exec(5) man:systemd.special(7) man:systemd.target(5)\nStopWhenUnneeded=yes\nAfter=hdd_smart_dump_on_usb_trigger@%i.service\n#BindsTo=%i.device\nRefuseManualStart=true\nRefuseManualStop=true\n\n[Service]\nType=oneshot\nExecStart=-/bin/bash -c '/opt/hdd_smart_dump_on_usb_trigger/bin/hdd_smart_dump_display_with_zenity.sh --display-dialogue'\n\n[Install]\nWantedBy=hdd_smart_dump_on_usb_trigger@%i.service\n
Run Code Online (Sandbox Code Playgroud)\n

命令的输出systemctl --user enable hdd_smart_dump_display_using_zenity.service

\n
Created symlink /home/ajthapa/.config/systemd/user/hdd_smart_dump_on_usb_trigger@.service.wants/hdd_smart_dump_display_using_zenity.service \xe2\x86\x92 /home/ajthapa/.config/systemd/user/hdd_smart_dump_display_using_zenity.service.\nUnit /home/ajthapa/.config/systemd/user/hdd_smart_dump_display_using_zenity.service is added as a dependency to a non-existent unit hdd_smart_dump_on_usb_trigger@.service.\n
Run Code Online (Sandbox Code Playgroud)\n

“...依赖项添加到不存在的单元...”阻止在用户单元中启动编码脚本。

\n

在 setup-03 中,udev .rules 文件仅触发 systemd 文件的系统单元。

\n

设置-04:

\n

文件列表:

\n
/etc/00_hdd_smart_dump_on_usb_trigger.conf\n/etc/systemd/system/hdd_smart_dump_on_usb_trigger@.service\n/etc/systemd/system/hdd_smart_dump_on_usb_trigger@.service.d/disable_manual_start.conf\n/etc/systemd/system/hdd_smart_dump_on_usb_trigger@.target\n/etc/udev/00_hdd_smart_dump_on_usb_trigger.udev.sh\n/etc/udev/rules.d/99-hdd-smart-dump-on-usb-trigger.udev.rules\n/opt/hdd_smart_dump_on_usb_trigger/bin/hdd_smart_dump_display_with_zenity.sh\n/opt/hdd_smart_dump_on_usb_trigger/bin/hdd_smart_dump_on_usb_trigger.sh\n/home/ajthapa/.config/systemd/user/hdd_smart_dump_display_using_zenity@.service\n/home/ajthapa/.config/systemd/user/hdd_smart_dump_display_using_zenity@.target\n
Run Code Online (Sandbox Code Playgroud)\n

内容/home/ajthapa/.config/systemd/user/hdd_smart_dump_display_using_zenity@.service

\n
[Unit]\nDescription=HDD SMART Dump Display Using Zenity Dialogue\nDocumentation=man:systemd.unit(5) man:systemd.exec(5) man:systemd.special(7) man:systemd.target(5)\nConditionPathExistsGlob=/sys/class/block/sd*\nRefuseManualStart=true\nRefuseManualStop=true\n\n[Service]\nType=oneshot\nExecStart=-/bin/bash -c '/opt/hdd_smart_dump_on_usb_trigger/bin/hdd_smart_dump_display_with_zenity.sh --display-dialogue'\n
Run Code Online (Sandbox Code Playgroud)\n

内容/home/ajthapa/.config/systemd/user/hdd_smart_dump_display_using_zenity@.target

\n
[Unit]\nDescription=HDD SMART Dump Display Using Zenity Dialogue - target unit for %I\nDocumentation=man:systemd.unit(5) man:systemd.exec(5) man:systemd.special(7) man:systemd.target(5)\nStopWhenUnneeded=yes\nRequires=hdd_smart_dump_display_using_zenity@%i.service\nBefore=hdd_smart_dump_display_using_zenity@%i.service\nRefuseManualStart=true\nRefuseManualStop=true\n
Run Code Online (Sandbox Code Playgroud)\n

system-unit .target 和 user-unit .target 由 udev 规则触发。通过这种 systemd 系统、用户单元和 udev 规则的配置,这些用户单元似乎在系统单元之前执行。例如,当第一次连接 USB 设备时,zenity 显示空白。当设备弹出并再次连接时,用户单元首先执行并读取由系统单元运行的脚本写入的先前值,因此显示(先前插入的设备的)过时值。

\n

更新:在 setup-04 中,在用户单元 .service 文件中,我添加了大约 3-5 秒的延迟,并且设置按预期工作,但这不是我想要的方式,我希望通过以下方式完成单元文件中的 Systemd 设置。

\n

ExecStart=-/bin/bash -c 'sleep 3s; /opt/hdd_smart_dump_on_usb_trigger/bin/hdd_smart_dump_display_with_zenity.sh --display-dialogue'我在 .service 用户单元文件中使用。

\n
\n

知道我在这些设置中做错了什么吗?

\n

Raf*_*ffa 4

这是触发的演示zenity,该对话框由 UDEV 规则触发,该规则是在插入(添加)USB 磁盘时触发的...此答案的目的是用作模板或样板,它\ 并不意味着作为您的用例的实际解决方案。

\n

创建用户服务单元文件:

\n
cat <<\'EOF\'>  ~/.config/systemd/user/my-test-zenity.service \n[Unit]\nDescription=Test zenity dialog from a user sevice\nAfter=graphical-session.target\n\n[Service]\nType=oneshot\nExecStart=/bin/sh -c \'zenity --info --text="USB Disk Added"\'\n\n[Install]\nWantedBy=graphical-session.target\nEOF\n
Run Code Online (Sandbox Code Playgroud)\n

通知 Systemd 守护进程:

\n
systemctl --user daemon-reload\n
Run Code Online (Sandbox Code Playgroud)\n

启用它并启动它:

\n
systemctl --user enable --now my-test-zenity.service\n
Run Code Online (Sandbox Code Playgroud)\n

...这应该会触发zenity对话窗口,并且您应该已经看到它。

\n

创建 UDEV 规则:

\n
cat <<\'EOF\' | sudo tee /etc/udev/rules.d/70-user-service.rules\nACTION=="add", SUBSYSTEM=="block", KERNEL=="sd*", ENV{DEVTYPE}=="disk", TAG+="systemd", ENV{SYSTEMD_USER_WANTS}+="my-test-zenity.service"\nEOF\n
Run Code Online (Sandbox Code Playgroud)\n

...SYSTEMD_USER_WANTS用户服务与SYSTEMD_WANTS系统服务的注意事项。

\n

重新启动 UDEV 服务以捕获新的规则文件:

\n
sudo systemctl restart udev\n
Run Code Online (Sandbox Code Playgroud)\n

测试一下:

\n

插入 USB 磁盘,您应该会看到zenity对话窗口被触发...只要图形用户会话正在运行,这应该在任何显示服务器上同样触发...更多相关讨论请参见此处

\n

笔记:

\n

上面评论的摘录:... 用户单元不能引用或依赖系统单元,反之亦然 \xe2\x80\xa6 它们在完全隔离的进程中运行,并且由两个不同的 Systemd 管理器(一个系统单元)管理经理和用户单位经理)...

\n

  • @rusty UDEV 进程在某些方面是沙盒的,例如网络访问和触发 UDEV 规则的设备可能无法使用,直到它触发的所有规则完成处理,因此实用程序如果同时运行,可能看不到设备,例如 https:// /askubuntu.com/a/1417803 ... 因此,systemd 服务更可取,因为它将允许 UDEV 规则完成处理并使设备可用于脚本中使用的实用程序(包括“smartctl”)。 (2认同)