LINUX.ORG.RU

Автозапуск Qt приложения с помощью SysVinit

 , , ,


1

3

Мне нужно сделать, чтобы после загрузки Linux (сразу после splash screen) запускалось мое Qt-приложение в foreground (не демон!). В сборке используется sysvinit в качестве системы инициализации. X-ов нету, qt работает поверх EGLFS. К сожалению, не получается решит проблему. Я добавил скрипт в /etc/inid.d/myapp.sh:

#! /bin/sh
# /etc/init.d/myapp
#

# Some things that run always
/home/root/myapp

case "$1" in
  start)
    echo "Starting script myapp "
    /home/root/myapp
    ;;
  stop)
    echo "Stopping script myapp"
    pkill myapp
    ;;
  *)
    echo "Usage: /etc/init.d/myapp {start|stop}"
    exit 1
    ;;
esac

exit 0
назначил права для запуска, добавил символические ссылки с помощью update-rc.d myapp defaults 99 в inittab для запуска getty задал автологин:
1:12345:respawn:/sbin/getty -a root 38400 tty1
Однако, после загрузки у меня просто черный экран. Через ssh с помощью скрипта все запускается:
/etc/init.d/myapp.sh start
С systemd эту проблему решить получалось, но вот с sysvinit ничего не выходит. Лог загрузки (/var/log/boot) пустой. Подскажите пожалуйста, что я делаю не так? Хотя бы в какую сторону копать?

Ковыряйся в ~/.xinitrc. Ты зачем-то приложение запускаешь ДО старта иксов.

anonymous ()
Ответ на: комментарий от annulen

Чтобы инит-скрипт работал, симлинк на него должен быть в /etc/rc*.d

Туда все добавил: update-rc.d myapp defaults 99

JamesMoore ()
Ответ на: комментарий от anonymous

Или в /etc/X11/xinitrc

Использую Qt поверх EGLFS, так что X.org нету в сборке.

До меня сейчас дошло, что я запускаю приложение в фоне таким образом. Попробовал в /etc/inittab строчку

1:12345:respawn:/sbin/getty 38400 tty1
заменить на:
1:12345:respawn:/home/root/myapp
и ничего не происходит.

JamesMoore ()
Ответ на: комментарий от JamesMoore

ааа, не заметил что raspbian, звиняйте )
ubuntu

x905 ★★★★★ ()
Ответ на: комментарий от Deleted

Что само приложение пишет в лог? Запускается вручную?

Вручную запускается /etc/init.d/myapp.sh start, лог пустой (/var/log/boot). Да я уже понял что мне такой вариант не подходит. Мне нужно чтобы не в фоне запускалось, а foreground сразу после инициализации системы. Вот как это сделать я даже не представляю.

JamesMoore ()
Ответ на: комментарий от JamesMoore

тебе надо настроить, чтобы после автологина запускались X (startx). А запуск своей программы вставлять в конец /etc/X11/xinit/xinitrc (или посмотреть какие он файлы вызывает в домашнем каталоге пользователя типа ~/.xinit или ~/.xsession). Также можно настроить автозапуск программы в конкретном DE, который запускается после старта X. Кстати попробуй в /etc/rc.local (создай и сделай исполняемым) написать:


startx &
my_proga

sigurd ★★★★ ()
Последнее исправление: sigurd (всего исправлений: 1)
Ответ на: комментарий от LiBer

Правда? А куда-же Х делись? Я вот смотрю сейчас на свою rpi и вижу запущенные X. И автор нигде не упоминал, что работает с спец. версией Qt для работы через FB.

sigurd ★★★★ ()

Приложение правильно демонизируется?

Если нет - пиши

setsid /home/root/myapp &>> /tmp/myapp.log

в своём скрипте и будет тебе счастье.

У тебя твоя софтина является потомком скрипта, и когда скрипт завершается по окончании загрузки, то помирает и софтина.

Если ты запускаешь софтину из шелла - то оно проживёт подольше - пока не отлогинишься.

Stanson ★★★★★ ()
Последнее исправление: Stanson (всего исправлений: 1)
Ответ на: комментарий от sigurd

ну тебе уже ответили, автор конечно не достаточно явно это описал, но суть в том что исков там нет, это qt embedded, довольно популярная штука.

LiBer ★★★ ()

Короче, просто после экрана загрузки запустить свое GUI приложение на linux какая-то невероятно сложная задача. Уже перерыл всякие статьи и посты на форумах и ничего полезного не могу найти. С systemd еще некоторое подобие получалось, а с sysvinit вообще загадка.

JamesMoore ()
Ответ на: комментарий от pup_kin

Всё как обычно, классический случай. Запускай в своём скрипте командой

nohup запустит приложение в фоновом режиме ведь?

JamesMoore ()
Ответ на: комментарий от JamesMoore

ДА, я так на дебиане запускал свои «демоны» на питоне. Нужно было отслеживать когда отвалятся диски у сервера, он был глючный. Так вот я написал софтверный вотчдог, который перезагружал сервер если не удавалось ничего записать или прочитать из файла. Для прстоты я сделал это в виде пары питоновских скриптов, делать демона мне показалось сложным, поэтому демонизировал эти скрипты через init.d и nohup. Всё работало.

pup_kin ()
Ответ на: комментарий от pup_kin

Спасибо за то что помогаете. Тут дело у меня обстоит иначе. Демон не нужен, нужно чтобы на embedded собрке линуксовой сразу запускалось Qt приложение с GUI. Т.е. чтобы для пользователя было все скрыто, кроме этого приложения.

JamesMoore ()
Ответ на: комментарий от JamesMoore

Stanson выше написал в чём может быть дело:

У тебя твоя софтина является потомком скрипта, и когда скрипт завершается по окончании загрузки, то помирает и софтина.

Если ты запускаешь софтину из шелла - то оно проживёт подольше - пока не отлогинишься.

pup_kin ()
Ответ на: комментарий от pup_kin

Всё как обычно, классический случай. Запускай в своём скрипте командой

nohup /home/root/myapp & попробовал такой вариант для очистки совести, увы приложение не запускается.

JamesMoore ()

Я не слышал про Embedded QT без иксов, очень интересно.
Можешь дать линк почитать, где написано толково?

fehhner ★★★★★ ()
Ответ на: комментарий от fehhner

Здрасьте, приехали.

http://doc.qt.io/qt-5/embedded-linux.html

http://doc.qt.io/qt-4.8/qt-embedded-linux.html

В Qt 4 ещё была легковесная замена иксам, которая называлась QWS. Ныне выпилена.

И недавно на ЛОРе топик всплывал: Графическое приложение без X-сервера

EXL ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.