Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Автоматический запуск приложения при загрузке Linux
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Linux
Kirill_Good
Добрый день!

Не могу заставить запускаться бинарник во время загрузки Linux. Добавил в папку /etc/init.d скрипт :

#!/bin/sh
/home/root/app

Сделал на него ссылку в /etc/rc5.d S97launch_app. Система запускается с этим runlevel. Смотрю список процессов после старта его там нет. Запускаю вручную /etc/rc5.d/S97launch_app - работает. Потом поменял в init скрипте не запуск приложения, а запуск скрипта который запускает уже приложение в бесконечном цикле.

#!/bin/sh
while true
do
/home/root/app
sleep 1
done

После загрузки системы вижу в top, что процесс app запускается и сразу завершается и так далее. С приложением все нормально.

Поможет кто?

Спасибо!

andrew_b
Абы какие скрипты в /etc/init.d класть нельзя. Они должны удовлетворять некоторому шаблону. Посмотрите, как устроен любой скрипт из этого каталога.
kurtis
Что у вас за дистрибутив?
Kirill_Good
Я и по шаблону делал. С case, start, stop. Но, блин, есть ли разница между шаблоном и моим скриптом? Ну не буду я start , stop парсить, это же дела скрипта.

Дистрибутив : Angstrom.
kurtis
Цитата
что процесс app запускается и сразу завершается и так далее.

Погодите, если приложение запускается и сразу выходит, то и в инит-скрипте оно тоже будет запускаться и сразу выходить.

Я бы добавил в самое начало приложения что-то вроде
fprintf(stderr, "Application %s started, %s %s\n", APP_NAME, __DATE__, __TIME__);
Тогда будет видно в чем именно проблема, что приложение не запустилось, или оно запустилось, но работает не так как ожидалось.
Cosmojam
Цитата(andrew_b @ Aug 17 2012, 14:59) *
Абы какие скрипты в /etc/init.d класть нельзя. Они должны удовлетворять некоторому шаблону. Посмотрите, как устроен любой скрипт из этого каталога.

Не правда. Иниту не важно что внутри скрипта, главное чтобы был исполняемым и шабанг (#!/bin/sh) присутствовал. start/stop и пр. - это удобства http://www.debian-administration.org/articles/28
Бесконечный цикл в init-скрипте - плохая идея. Если просто из терминала приложение запускается и работает, а из инит-скрипта - нет, то смотрите в сторону окружения, может не хватает какой-то ещё программы ему, которая есть у юзера в PATH, но сама переменная PATH на момент запуска init не содержит нужного пути. Или библиотека какая
Цитата(kurtis)
Я бы добавил в самое начало приложения что-то вроде
fprintf(stderr, "Application %s started, %s %s\n", APP_NAME, __DATE__, __TIME__);
Тогда будет видно в чем именно проблема, что приложение не запустилось, или оно запустилось, но работает не так как ожидалось.

Да, но что Вам дадут дата и время сборки приложения? Тогда уж
Код
time_t t = time(NULL);
fprintf(stderr, "Application %s started %s\n", argv[0], ctime(&t));
Kirill_Good
Цитата
Если просто из терминала приложение запускается и работает, а из инит-скрипта - нет, то смотрите в сторону окружения, может не хватает какой-то ещё программы ему, которая есть у юзера в PATH, но сама переменная PATH на момент запуска init не содержит нужного пути. Или библиотека какая

В скриптах везде указывал абсотлютные пути для приложений. Приложение динамически слинковано. Попробую проверить насчет библиотек.

Цитата
Да, но что Вам дадут дата и время сборки приложения? Тогда уж
Код
time_t t = time(NULL);
fprintf(stderr, "Application %s started %s\n", argv[0], ctime(&t));


Я не совсем понимаю , что дадут мне эти выводы на stderr. Приложение выводит на stdout, stderr в процессе работы. Вот где бы мне посмотреть этот вывод? В системных логах?
_Pasha
Цитата(Kirill_Good @ Aug 19 2012, 08:05) *
Я не совсем понимаю , что дадут мне эти выводы на stderr. Приложение выводит на stdout, stderr в процессе работы. Вот где бы мне посмотреть этот вывод? В системных логах?

Код
/home/root/app 2 > /home/report.txt

Направить вывод куда надо.
Kirill_Good
Цитата(_Pasha @ Aug 19 2012, 09:44) *
Код
/home/root/app 2 > /home/report.txt

Направить вывод куда надо.


Делал так, файл пустой был. Правда вывода строки сразу после main не делал.
kurtis
Цитата(Cosmojam @ Aug 19 2012, 00:12) *
Да, но что Вам дадут дата и время сборки приложения? Тогда уж

Для надежности. Если только что собрал приложение и записал его на устройство, а там время сборки вчера, то значит что-то где-то работает не так как ожидалось.

Цитата(Kirill_Good @ Aug 19 2012, 08:05) *
Я не совсем понимаю , что дадут мне эти выводы на stderr. Приложение выводит на stdout, stderr в процессе работы. Вот где бы мне посмотреть этот вывод? В системных логах?

stderr не буферизирован, stdout буферизирован.
_Pasha
Цитата(Kirill_Good @ Aug 19 2012, 09:01) *
Делал так, файл пустой был. Правда вывода строки сразу после main не делал.

Может, там вообще изначально в stderr вывода не было? Не доходило типа до него.
Kirill_Good
Проблема все еще остается. Выяснились новые детали. Я пробовал запускать другой бинарник для тестов с таким кодом :

тестовый бинарник :
int main() {
fprintf(stderr, "Hello!\n");
while(1)
{sleep(1);}
}

Добавил те же строчки в нужный.

бинарник который нужно запустить :
int main() {
fprintf(stderr, "Hello!\n");
while(1)
{sleep(1);}
...
}

Первый запускается на ура. Второй нет. В скрипте запуска редирект &> /home/root/log
Скомпилированы одним компилятором.


Kirill_Good
Причина была в приложении. Оказалось, что


#include <stdio.h>
int j = printf("Global\n");
int main()
{
printf("Stack\n");
return 0;
}

gcc -Wall -o app app.c Даст на выходе "error: initializer element is not constant"
g++ -Wall -o app app.c Скомпилирует без предупреждений. После запуска на stdout : Global\nStack

В моем коде оказалось, что были строчки до main вроде ClassA A = new ClassA(). Я их написал, да забыл про них. Все работало. Вызывались конструкторы класса и до строчки не доходило.
int main() {
--->> fprintf(stderr, "Hello!\n");
...
}

Не знаю как в памяти всё это размещается.
gemuz
Цитата(Kirill_Good @ Aug 17 2012, 11:55) *
Добрый день!

Не могу заставить запускаться бинарник во время загрузки Linux. Добавил в папку /etc/init.d скрипт :

#!/bin/sh
/home/root/app

Сделал на него ссылку в /etc/rc5.d S97launch_app. Система запускается с этим runlevel. Смотрю список процессов после старта его там нет. Запускаю вручную /etc/rc5.d/S97launch_app - работает. Потом поменял в init скрипте не запуск приложения, а запуск скрипта который запускает уже приложение в бесконечном цикле.

#!/bin/sh
while true
do
/home/root/app
sleep 1
done

После загрузки системы вижу в top, что процесс app запускается и сразу завершается и так далее. С приложением все нормально.

Поможет кто?

Спасибо!


Добрый день, думаю вопрос решиться при помощи: этого
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.