【问题标题】:Run Qt application on startup as Linux daemon在启动时将 Qt 应用程序作为 Linux 守护程序运行
【发布时间】:2010-11-08 05:18:42
【问题描述】:

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

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

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

Forking like in an other question 几乎可以正常工作,尝试启动 TCP 服务器后出现“未知错误”。不过,应该有一种简单的方法来编写一个 init 脚本,以便在各种 Linux 发行版上启动时在后台运行我的应用程序。

谁能指出我正确的方向?

在 Qt 4.5 中使用 Ubuntu 9.10

【问题讨论】:

  • 你提供任何 gui 还是完全控制台?
  • 它是 consoly-only,永远不需要任何用户输入。

标签: qt scripting startup daemon init.d


【解决方案1】:

您可以查看/etc/init.d 中已有的许多脚本以获取灵感。据我所见,大多数标准 linux 守护进程都依赖startproc 启动,killproc 停止。

【讨论】:

  • 在这里给出更具体的例子会很有帮助。另外,请使用代码格式使您的帖子更具可读性。
【解决方案2】:

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

例如,startproc。

【讨论】:

    【解决方案3】:

    最好的方法可能是使用QtService,它会为你处理分叉的工作。

    但是,如果您想继续构建自己的应用程序,您应该在后台运行该应用程序,或者通过 OpenRC 随附的 start-stop-daemon 或用于您的发行版的类似实用程序运行它。

    另外,请确保您只链接到 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 库也被引入,尽管从上面的输出中过滤。

    【讨论】:

      【解决方案4】:

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

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

      $man update-rc.d
      

      【讨论】:

        【解决方案5】:

        您的程序是 GUI 应用程序还是在没有 GUI 的情况下也能工作?

        为什么不直接在初始化脚本中使用 & 作为背景呢?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-18
          • 2014-01-26
          • 1970-01-01
          • 2014-05-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多