在Linux守护进程中启动Qt应用程序

7

我开发了一个包含TCP服务器的Qt应用程序。现在我试图制作Ubuntu软件包,并让应用程序在启动时自动启动。

即使没有用户登录,该应用程序也需要运行,这意味着需要通过位于/etc/init.d/中的脚本启动守护进程。

我尝试在init.d脚本中启动应用程序并在停止时发送kill信号,但这意味着应用程序在前台运行并阻塞init脚本。

像其他问题中的分叉似乎几乎有效,但是在尝试启动TCP服务器后出现“未知错误”。然而,应该有一种简单的方式编写init脚本,在各种Linux发行版上在后台启动我的应用程序。

有人能指点我正确的方向吗?

使用Ubuntu 9.10和Qt 4.5


你提供任何 GUI 吗,还是完全在控制台中运行? - Jesse Vogt
它仅限于控制台,并且从不需要任何用户输入。 - dutchmega
5个回答

2
最好的方法可能是使用QtService,其中分叉工作已经为您处理。
然而,如果您想继续构建自己的应用程序,您应该将其放在后台或通过start-stop-daemon来运行,该程序与OpenRC或类似于您的发行版的实用程序一起提供。
此外,请确保仅链接到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库也被引入,不过它们从上述输出中被过滤掉了。

1
你的程序是GUI应用程序还是无需GUI就能运行?
为什么不在init脚本中使用&来将其后台化?

1

关于编程,您需要根据默认运行级别将符号链接添加到 /etc 下的任何 rc?.d 目录中。或使用 update-rc.d 脚本:首先需要创建一个脚本以执行应用程序;其次,使用 update-rc.d 脚本添加所需的文件以启动。

您可以通过阅读 update-rc.d 手册页面来了解如何操作:

$man update-rc.d

0
你可以查看已经存在于/etc/init.d目录下的许多脚本,以获取灵感。从我所看到的,大多数标准Linux守护进程都依赖于startproc来启动,而使用killproc来停止。

在这里给出更具体的例子会更有帮助。同时,请使用代码格式使您的帖子更易读。 - bcr

0

我认为最简单的方法是不在应用程序本身中包含任何守护进程逻辑,而是使用一个辅助程序在后台启动应用程序并管理其pid。

例如,startproc


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接