在启动时将 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 守护程序运行的主要内容,如果未能解决你的问题,请参考以下文章

Qt中的linux系统守护进程

Linux:在连接的 USB 串行加密狗上启动守护程序

CentOS7 将QT应用作为开机自启动(Linux系统)

如何在 linux 中将 Perl 脚本作为系统守护进程运行?

定时任务程总结

Linux守护进程的启动方法