![`/etc/network/if-up.d` 脚本运行,但不启动 GUI 应用程序(例如 firefox-esr)](https://linux22.com/image/137629/%60%2Fetc%2Fnetwork%2Fif-up.d%60%20%E8%84%9A%E6%9C%AC%E8%BF%90%E8%A1%8C%EF%BC%8C%E4%BD%86%E4%B8%8D%E5%90%AF%E5%8A%A8%20GUI%20%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%EF%BC%88%E4%BE%8B%E5%A6%82%20firefox-esr%EF%BC%89.png)
我需要firefox-esr
在网络可用后开始。
这是我所得到的:
sudo tee "/etc/network/if-up.d/upif" > /dev/null << EOFBOOT
#!/bin/bash
DISPLAY=":0"
if [[ "\$IFACE" = "eth0" || "\$IFACE" = "wlan0" ]]; then
echo "\$(date) \$IFACE" >> /var/log/upif
firefox-esr &
fi
EOFBOOT
sudo chmod +x "/etc/network/if-up.d/upif"
我在日志文件中获取日期和接口名称,这意味着脚本运行但未firefox-esr
启动。
我尝试过的:
- 添加
DISPLAY=":0"
grep -inR "firefox" /var/log
- 使用可执行文件的完整路径,即
/usr/bin/firefox-esr
- 使用
sudo firefox-esr &
- 删除尾随
&
没有任何帮助。但是,如果我将其放在IFACE="eth0"
shebang 下方,然后sudo /etc/network/if-up.d/upif
手动运行,那么您在上面看到的确切脚本就会完成这项工作并启动 Firefox。
我不确定那里出了什么问题。
它2018-06-27-raspbian-stretch-lite
运行的是 Debian 9.4。
PS 另外,我最初在尝试启动 Firefox 之前逻辑检查它是否已经运行,但是当我意识到 Firefox 根本没有启动时,我将其删除了
更新发现类似的问题:在 NetworkManager if-up.d 脚本中启动 GUI
答案1
网络事件脚本以 root 用户身份运行,但您的桌面环境可能(希望)不是。
一般来说,这似乎是一种有问题的方法。缺少一些东西:
- Firefox 应以您的登录用户身份运行,而不是 root 用户。
- Firefox 需要能够对 X 服务器进行身份验证才能连接到它(请参阅
~/.Xauthority
和man xauth
)。 - 需要设置 Firefox 的环境才能在桌面会话中正常工作(
HOME
等XDG_RUNTIME_DIR
)
我建议尝试一种不同的方法,例如让网络脚本将网络状态(通过管道/临时文件/DBus)传递给用户会话中已经运行的东西(例如从启动~/.xinitrc
),然后根据需要启动GUI应用程序。
答案2
感谢法达比·纳维,这就是答案:
su pi -c "DISPLAY=:0.0 /usr/bin/firefox-esr &"
关键点:
- su 到您通常使用的实际用户(
pi
在我的例子中) - 将显示号码传递到那里(TODO:找出实际的显示编号而不是假设它是
:0
) - 重要的使用 Firefox 可执行文件的完整路径,而不是
firefox-esr