我有一个 python gtk 应用程序,需要在用户登录时运行。我无法让 upstart 启动任何 gui 应用程序,即使 x 正在运行。
当我登录 X 时,我从下面的 upstart 脚本发出事件
guitest
使用 initctl,我得到
initctl: Event failed
这是我的脚本示例,只不过我用我的应用程序替换了 gedit。我该如何修改此脚本以便启动 gedit 或我的 python gtk 应用程序?
task
start on desktop-session-start or guitest
script
gedit
end script
答案1
Upstart 主要用于管理系统服务。如果你想在用户会话中运行某个应用程序,那么还有更好的工具。
通过 GUI
Startup Applications...
您可以通过从屏幕右上角的齿轮菜单中选择来配置用户会话中的启动应用程序,然后选择Add
并填写详细信息gedit
。
当您下次登录时,应用程序应该以会话启动。
手动
如果您无法使用 UI 进行此项配置,则可以通过将.desktop
文件放入其中一个目录autostart
来根据自动启动规范进行配置:
http://standards.freedesktop.org/autostart-spec/autostart-spec-latest.html
如果您希望它影响系统上的每个用户,请将文件放在 中/etc/xdg/autostart
。如果您只想影响单个用户,请将文件放在 中~/.config/autostart
。
该.desktop
文件看起来应该类似于:
[Desktop Entry]
Type=Application
Exec=/usr/bin/gedit
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name=GEdit
Comment=
如果将文件放在用户的主目录中,请确保为文件设置执行位。这是安全措施的一部分,旨在阻止程序.desktop
因错误而无意中写入工作文件。
答案2
我找到了一个解决方法。如果其他人知道“正确的方法”,请告诉我。
upstart 脚本需要编写一个标志文件。用户启动的另一个进程将不断寻找要创建的标志文件。upstart 脚本可以在标志文件中留下任何相关信息。普通用户或 root 用户当然可以毫无问题地运行 gui 应用程序。为什么 upstart 确实存在问题,还有待解答。
答案3
通过在 upstart 脚本中设置“USER”环境变量和“DISPLAY”环境变量,我可以让它与 QT 应用程序一起工作。
# gui - auto launch daemon
description "gui daemon"
start on desktop-session-start
stop on desktop-shutdown
env HOME=/home/user
script
export DISPLAY=:0
mygui
end script
当然,它仅限于给定的用户,因此对于某些用例来说可能不是一个有效的选项,但就我而言,它是完美的。