在启动时运行Qt应用程序作为Linux守护程序

时间:2009-07-05 14:17:24

标签: qt scripting startup daemon init.d

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

即使没有人登录,应用程序也需要运行,这意味着通过/etc/init.d /

中的脚本启动守护进程

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

Forking like in an other question几乎可以正常工作,在尝试启动TCP服务器后,我收到“未知错误”。然而,应该有一种简单的方法来编写一个init-script,它在各种Linux发行版的启动时在后台运行我的应用程序。

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

将Ubuntu 9.10与Qt 4.5一起使用

5 个答案:

答案 0 :(得分: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 :(得分:1)

您的程序是GUI应用程序还是没有GUI工作?

为什么不使用&?

在init脚本中对其进行后台处理

答案 2 :(得分:1)

您需要在/ etc下的任何rc?.d目录中添加符号链接,具体取决于默认的运行级别。或者使用update-rc.d脚本:首先需要在/etc/init.d中创建一个执行应用程序的脚本;第二,使用update-rc.d脚本添加所需的文件以启动。

您可以通过阅读update-rc.d手册页找到有关如何操作的信息:

$man update-rc.d

答案 3 :(得分:0)

我认为最简单的方法是在应用程序本身中没有任何守护程序逻辑,而是使用帮助程序在后台启动应用程序并为其管理pid。

例如,startproc

答案 4 :(得分:0)

您可以查看/etc/init.d中已有的许多脚本以获取灵感。从我看到的情况来看,大多数标准Linux守护进程依赖于startproc作为开始,killproc用于停止。