在启动时作为 Linux 守护进程运行 Qt 应用程序
题
我开发了一个 Qt 应用程序,其中包含 TCP 服务器等。我现在正在尝试制作 Ubuntu 软件包并让应用程序在启动时自动启动。
即使没有人登录,应用程序也需要运行,这意味着守护进程通过 /etc/init.d/ 中的脚本启动
我尝试在 init.d 脚本中简单地在启动时运行应用程序并在停止时发送终止信号,但这意味着应用程序在前台运行并阻止 init 脚本。
像另一个问题一样分叉 几乎似乎可以工作,在尝试启动 TCP 服务器后我收到“未知错误”。尽管如此,应该有一种简单的方法来编写一个初始化脚本,在各种 Linux 发行版上启动时在后台运行我的应用程序。
有人能指出我正确的方向吗?
将 Ubuntu 9.10 与 Qt 4.5 结合使用
解决方案
您的程序是 GUI 应用程序还是可以在没有 GUI 的情况下运行?
为什么不使用 & 将其放在初始化脚本中的背景中呢?
其他提示
最好的方法可能是使用 Qt服务 在这里,分叉工作会为您完成。
但是,如果您想继续构建自己的应用程序,则应该将应用程序置于后台或通过以下方式运行它 启动-停止-守护进程 附带 开放式RC 或适合您的发行版的类似实用程序。
另外,请确保您仅链接到 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 库也会被引入,尽管是从上面的输出中过滤掉的。
您需要根据默认运行级别将符号链接添加到 /etc 下的任何 rc?.d 目录中。或者使用 update-rc.d 脚本:首先,您需要在 /etc/init.d 中创建一个执行应用程序的脚本;其次,使用 update-rc.d 脚本添加启动所需的文件。
您可以通过阅读 update-rc.d 手册页找到有关如何执行此操作的信息:
$man update-rc.d
我认为最简单的方法是应用程序本身没有任何守护进程逻辑,而是使用辅助程序在后台启动应用程序并为其管理 pid。
例如, 启动过程.
您可以查看您的中已有的许多脚本 /etc/init.d
寻求灵感。据我所知,大多数标准 Linux 守护进程都依赖于 startproc
作为开始,并且 killproc
为了停止。