在启动时将 Qt 应用程序作为 Linux 守护程序运行
Posted
技术标签:
【中文标题】在启动时将 Qt 应用程序作为 Linux 守护程序运行【英文标题】:Run Qt application on startup as Linux daemon 【发布时间】:2010-11-08 05:18:42 【问题描述】:我开发了一个包含 TCP 服务器等的 Qt 应用程序。我现在正在尝试制作 Ubuntu 软件包并让应用程序在启动时自动启动。
即使没有人登录,应用程序也需要运行,这意味着守护程序通过 /etc/init.d/ 中的脚本启动
我尝试在 init.d 脚本中简单地在启动时运行应用程序并在停止时发送终止信号,但这意味着应用程序在前台运行并阻止初始化脚本。
Forking like in an other question 几乎可以正常工作,尝试启动 TCP 服务器后出现“未知错误”。不过,应该有一种简单的方法来编写一个 init 脚本,以便在各种 Linux 发行版上启动时在后台运行我的应用程序。
谁能指出我正确的方向?
在 Qt 4.5 中使用 Ubuntu 9.10
【问题讨论】:
你提供任何 gui 还是完全控制台? 它是 consoly-only,永远不需要任何用户输入。 【参考方案1】:您可以查看/etc/init.d
中已有的许多脚本以获取灵感。据我所见,大多数标准 linux 守护进程都依赖startproc
启动,killproc
停止。
【讨论】:
在这里给出更具体的例子会很有帮助。另外,请使用代码格式使您的帖子更具可读性。【参考方案2】:我认为最简单的方法是在应用程序本身中不包含任何守护程序逻辑,而是使用帮助程序在后台启动应用程序并为其管理 pid。
例如,startproc。
【讨论】:
【参考方案3】:最好的方法可能是使用QtService,它会为你处理分叉的工作。
但是,如果您想继续构建自己的应用程序,您应该在后台运行该应用程序,或者通过 OpenRC 随附的 start-stop-daemon 或用于您的发行版的类似实用程序运行它。
另外,请确保您只链接到 QtCore 共享库。尽管应用程序可能是命令行并且从不启动 GUI,但这并不意味着应用程序运行不需要 X。比如一组单元测试:
$ ldd runTests | grep Qt
libQtTest.so.4 => /usr/lib/qt4/libQtTest.so.4 (0x00007fd424de9000)
libQtXml.so.4 => /usr/lib/qt4/libQtXml.so.4 (0x00007fd424baa000)
libQtGui.so.4 => /usr/lib/qt4/libQtGui.so.4 (0x00007fd4240db000)
libQtCore.so.4 => /usr/lib/qt4/libQtCore.so.4 (0x00007fd422644000)
因为 QtGui 存在,所有 X 库也被引入,尽管从上面的输出中过滤。
【讨论】:
【参考方案4】:您需要在 /etc 下的任何 rc?.d 目录中添加符号链接,具体取决于默认运行级别。或者使用 update-rc.d 脚本:首先你需要在 /etc/init.d 中创建一个脚本来执行应用程序;其次,使用 update-rc.d 脚本添加启动所需的文件。
您可以通过阅读 update-rc.d 手册页找到有关如何执行此操作的信息:
$man update-rc.d
【讨论】:
【参考方案5】:您的程序是 GUI 应用程序还是在没有 GUI 的情况下也能工作?
为什么不直接在初始化脚本中使用 & 作为背景呢?
【讨论】:
以上是关于在启动时将 Qt 应用程序作为 Linux 守护程序运行的主要内容,如果未能解决你的问题,请参考以下文章