我开发了一个 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 为了停止。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top