Запустите приложение Qt при запуске в качестве демона Linux
Вопрос
Я разработал приложение Qt, которое содержит TCP-сервер и тому подобное.Сейчас я пытаюсь создать пакеты Ubuntu и позволить приложению автоматически запускаться при запуске.
Приложение должно быть запущено, даже если никто не вошел в систему, что означает, что демон запущен с помощью скрипта в /etc/init.d/
Я попытался просто запустить приложение при запуске и отправить сигнал уничтожения при остановке в скрипте init.d, но это означает, что приложение запускается на переднем плане и блокирует init-скрипт.
Разветвление, как в другом вопросе кажется, почти работает, я получаю "неизвестную ошибку" после попытки запустить TCP-сервер.Тем не менее, должен существовать простой способ написать init-скрипт, который запускает мое приложение в фоновом режиме при запуске в различных дистрибутивах Linux.
Может ли кто-нибудь указать мне правильное направление?
Использование Ubuntu 9.10 с Qt 4.5
Решение
Является ли ваша программа приложением с графическим интерфейсом или она работает без графического интерфейса?
Почему бы вам просто не создать фон для этого в скрипте инициализации с помощью &?
Другие советы
Вероятно, лучший способ - это использовать QtService ( КТСЕРВИС ) где о работе по разветвлению позаботятся за вас.
Однако, если вы хотите продолжить создавать свое собственное приложение, вам следует либо запустить его в фоновом режиме, либо через запуск-остановка-демон это приходит вместе с Открытый RCR или аналогичная утилита для вашего дистрибутива.
Кроме того, убедитесь, что вы ссылаетесь только на общую библиотеку QtCore.Хотя приложение может быть запущено из командной строки и никогда не вызывать графический интерфейс, это не означает, что 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 также загружаются, хотя и отфильтрованы из приведенного выше вывода.
Вам нужно добавить символическую ссылку в любой из каталогов rc?.d в /etc в зависимости от уровня выполнения по умолчанию.Или используйте скрипт update-rc.d:сначала вам нужно создать скрипт в /etc/init.d, который запускает приложение;во-вторых, используйте скрипт update-rc.d, чтобы добавить необходимые файлы для запуска.
Вы можете найти информацию о том, как это сделать, прочитав страницу руководства update-rc.d:
$man update-rc.d
Я думаю, что самый простой способ - это не иметь никакой логики демонизации в самом вашем приложении, вместо этого использовать вспомогательную программу для запуска приложения в фоновом режиме и управления для него pid.
Например, начальный процесс.
Вы можете ознакомиться со многими сценариями, уже имеющимися в вашем /etc/init.d
для вдохновения.Из того, что я там вижу, большинство стандартных демонов Linux зависят от startproc
для начала, и killproc
за то, что остановился.