我开发了一个包含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一起使用
答案 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
用于停止。