从手动udev
这只能用于运行时间非常短的前台任务。长时间运行事件进程可能会阻止该设备或从属设备的所有进一步事件。
我正在这样做:
KERNEL=="sd[a-z]", SUBSYSTEM=="block", ATTR{ro}=="0", ATTR{removable}=="1", SUBSYSTEMS=="usb", DRIVERS=="usb-storage", SYMLINK+="usb_%E{ID_VENDOR}_%E{ID_MODEL}_%E{ID_SERIAL_SHORT}"
ACTION=="add", KERNEL=="sd[a-z]", SUBSYSTEM=="block", ATTR{ro}=="0", ATTR{removable}=="1", SUBSYSTEMS=="usb", DRIVERS=="usb-storage", RUN+="/usr/bin/setsid /usr/bin/nautilus"
塞西德确实在新会话中运行程序
我在跑步X作为: root 937 1.4 1.3 179992 26328 tty2 S 通过 xinit /root/.xinitrc
答案1
要运行 X11 程序,您需要告诉它把窗口放在哪里。这是通过DISPLAY
环境变量完成的。
如果有用户在控制台登录,通常会有相应的显示:0
(但可以不止一个,并且:0
可以用于非控制台X服务器)。所以你需要运行一个包含以下内容的脚本
#!/bin/sh
export DISPLAY=:0
setsid nautilus &
你可能需要XAUTHORITY
除了设置DISPLAY
。
但这是错误的做法。如果控制台没有用户登录怎么办?如果控制台有多个用户怎么办?如果 X cookie 文件位于 root 无法直接访问的 FUSE 文件系统上怎么办?
有一种机制允许 udev 通知桌面应用程序:D总线。许多桌面环境使用它来安排在插入可移动设备时弹出文件管理器窗口。我不知道它到底是如何工作的,但这就是你需要研究的。