pre*_*ise 8 command-line wayland udev systemd
每次具有 SMART 功能的特定设备插入 USB 端口时,我都会在systemd .conf文件中使用以下内容来运行图形对话框。zenity这在使用显示服务器的 Xubuntu 中工作正常,但在WaylandX服务器中对话框显示zenity失败。
USER=myName\nDISPLAY=:0.0\nWAYLAND_DISPLAY=wayland-0\nXAUTHORITY=/home/myName/.Xauthority\nHOME=/home/myName\nSHELL=/bin/bash\nRun Code Online (Sandbox Code Playgroud)\n我尝试在 Ubuntu 23.10 中添加WAYLAND_DISPLAY=wayland-0Wayland服务器的.confzenity文件,但对话仍然无法显示。我还需要做什么?
我的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\nRun Code Online (Sandbox Code Playgroud)\n内容/etc/00_hdd_smart_dump_on_usb_trigger.conf:
USER=myName\nDISPLAY=:0.0\nWAYLAND_DISPLAY=wayland-0\nXAUTHORITY=/home/ajthapa/.Xauthority\nHOME=/home/myName\nSHELL=/bin/bash\nRun Code Online (Sandbox Code Playgroud)\n内容/etc/systemd/system/hdd_smart_dump_on_usb_trigger@.service:
[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"'\nRun Code Online (Sandbox Code Playgroud)\n内容/etc/systemd/system/hdd_smart_dump_on_usb_trigger@.service.d/disable_manual_start.conf:
[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\nRun Code Online (Sandbox Code Playgroud)\n内容/etc/systemd/system/hdd_smart_dump_on_usb_trigger@.target:
[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\nRun Code Online (Sandbox Code Playgroud)\n内容/etc/udev/rules.d/99-hdd-smart-dump-on-usb-trigger.udev.rules:
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"\nRun 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设置-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\nRun 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 用户单元文件和/或其命名中。
内容/home/myName/.config/systemd/user/hdd_smart_dump_display_using_zenity@.service:
[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'\nRun Code Online (Sandbox Code Playgroud)\n内容/etc/udev/rules.d/99-hdd-smart-dump-on-usb-trigger.udev.rules:
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"\nRun Code Online (Sandbox Code Playgroud)\nsudo systemctl --no-pager -l status 'hdd_smart_dump_on_usb_trigger*'插入USB设备的输出:
\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.\nRun Code Online (Sandbox Code Playgroud)\n没有 的输出systemctl --user --no-pager -l status 'hdd_*'。
设置-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\nRun Code Online (Sandbox Code Playgroud)\n内容/home/ajthapa/.config/systemd/user/hdd_smart_dump_display_using_zenity.service:
[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\nRun Code Online (Sandbox Code Playgroud)\n命令的输出systemctl --user enable hdd_smart_dump_display_using_zenity.service:
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.\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n内容/home/ajthapa/.config/systemd/user/hdd_smart_dump_display_using_zenity@.service:
[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'\nRun Code Online (Sandbox Code Playgroud)\n内容/home/ajthapa/.config/systemd/user/hdd_smart_dump_display_using_zenity@.target:
[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\nRun Code Online (Sandbox Code Playgroud)\nsystem-unit .target 和 user-unit .target 由 udev 规则触发。通过这种 systemd 系统、用户单元和 udev 规则的配置,这些用户单元似乎在系统单元之前执行。例如,当第一次连接 USB 设备时,zenity 显示空白。当设备弹出并再次连接时,用户单元首先执行并读取由系统单元运行的脚本写入的先前值,因此显示(先前插入的设备的)过时值。
\n更新:在 setup-04 中,在用户单元 .service 文件中,我添加了大约 3-5 秒的延迟,并且设置按预期工作,但这不是我想要的方式,我希望通过以下方式完成单元文件中的 Systemd 设置。
\nExecStart=-/bin/bash -c 'sleep 3s; /opt/hdd_smart_dump_on_usb_trigger/bin/hdd_smart_dump_display_with_zenity.sh --display-dialogue'我在 .service 用户单元文件中使用。
知道我在这些设置中做错了什么吗?
\n这是触发的演示zenity,该对话框由 UDEV 规则触发,该规则是在插入(添加)USB 磁盘时触发的...此答案的目的是用作模板或样板,它\ 并不意味着作为您的用例的实际解决方案。
创建用户服务单元文件:
\ncat <<\'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\nRun Code Online (Sandbox Code Playgroud)\n通知 Systemd 守护进程:
\nsystemctl --user daemon-reload\nRun Code Online (Sandbox Code Playgroud)\n启用它并启动它:
\nsystemctl --user enable --now my-test-zenity.service\nRun Code Online (Sandbox Code Playgroud)\n...这应该会触发zenity对话窗口,并且您应该已经看到它。
创建 UDEV 规则:
\ncat <<\'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\nRun Code Online (Sandbox Code Playgroud)\n...SYSTEMD_USER_WANTS用户服务与SYSTEMD_WANTS系统服务的注意事项。
重新启动 UDEV 服务以捕获新的规则文件:
\nsudo systemctl restart udev\nRun Code Online (Sandbox Code Playgroud)\n测试一下:
\n插入 USB 磁盘,您应该会看到zenity对话窗口被触发...只要图形用户会话正在运行,这应该在任何显示服务器上同样触发...更多相关讨论请参见此处。
笔记:
\n上面评论的摘录:... 用户单元不能引用或依赖系统单元,反之亦然 \xe2\x80\xa6 它们在完全隔离的进程中运行,并且由两个不同的 Systemd 管理器(一个系统单元)管理经理和用户单位经理)...
\n