реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Автоматический запуск приложения при загрузке Linux
Kirill_Good
сообщение Aug 17 2012, 08:55
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 217
Регистрация: 10-12-10
Из: Москва
Пользователь №: 61 528



Добрый день!

Не могу заставить запускаться бинарник во время загрузки 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 запускается и сразу завершается и так далее. С приложением все нормально.

Поможет кто?

Спасибо!

Go to the top of the page
 
+Quote Post
andrew_b
сообщение Aug 17 2012, 11:59
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Абы какие скрипты в /etc/init.d класть нельзя. Они должны удовлетворять некоторому шаблону. Посмотрите, как устроен любой скрипт из этого каталога.
Go to the top of the page
 
+Quote Post
kurtis
сообщение Aug 17 2012, 12:48
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205



Что у вас за дистрибутив?
Go to the top of the page
 
+Quote Post
Kirill_Good
сообщение Aug 17 2012, 13:07
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 217
Регистрация: 10-12-10
Из: Москва
Пользователь №: 61 528



Я и по шаблону делал. С case, start, stop. Но, блин, есть ли разница между шаблоном и моим скриптом? Ну не буду я start , stop парсить, это же дела скрипта.

Дистрибутив : Angstrom.
Go to the top of the page
 
+Quote Post
kurtis
сообщение Aug 18 2012, 17:35
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205



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

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

Я бы добавил в самое начало приложения что-то вроде
fprintf(stderr, "Application %s started, %s %s\n", APP_NAME, __DATE__, __TIME__);
Тогда будет видно в чем именно проблема, что приложение не запустилось, или оно запустилось, но работает не так как ожидалось.
Go to the top of the page
 
+Quote Post
Cosmojam
сообщение Aug 18 2012, 21:12
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 311
Регистрация: 12-01-11
Из: Калининград (Koenigsberg)
Пользователь №: 62 182



Цитата(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));


--------------------
typedef enum { no, yes, maybe } bool; | блог тут
Go to the top of the page
 
+Quote Post
Kirill_Good
сообщение Aug 19 2012, 05:05
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 217
Регистрация: 10-12-10
Из: Москва
Пользователь №: 61 528



Цитата
Если просто из терминала приложение запускается и работает, а из инит-скрипта - нет, то смотрите в сторону окружения, может не хватает какой-то ещё программы ему, которая есть у юзера в PATH, но сама переменная PATH на момент запуска init не содержит нужного пути. Или библиотека какая

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

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


Я не совсем понимаю , что дадут мне эти выводы на stderr. Приложение выводит на stdout, stderr в процессе работы. Вот где бы мне посмотреть этот вывод? В системных логах?


Сообщение отредактировал Kirill_Good - Aug 19 2012, 05:06
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Aug 19 2012, 05:44
Сообщение #8


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



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

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

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

Сообщение отредактировал _Pasha - Aug 19 2012, 05:47
Go to the top of the page
 
+Quote Post
Kirill_Good
сообщение Aug 19 2012, 06:01
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 217
Регистрация: 10-12-10
Из: Москва
Пользователь №: 61 528



Цитата(_Pasha @ Aug 19 2012, 09:44) *
Код
/home/root/app 2 > /home/report.txt

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


Делал так, файл пустой был. Правда вывода строки сразу после main не делал.
Go to the top of the page
 
+Quote Post
kurtis
сообщение Aug 19 2012, 10:12
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205



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

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

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

stderr не буферизирован, stdout буферизирован.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Aug 19 2012, 10:14
Сообщение #11


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



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

Может, там вообще изначально в stderr вывода не было? Не доходило типа до него.

Сообщение отредактировал _Pasha - Aug 19 2012, 10:15
Go to the top of the page
 
+Quote Post
Kirill_Good
сообщение Aug 23 2012, 11:37
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 217
Регистрация: 10-12-10
Из: Москва
Пользователь №: 61 528



Проблема все еще остается. Выяснились новые детали. Я пробовал запускать другой бинарник для тестов с таким кодом :

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

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

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

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


Go to the top of the page
 
+Quote Post
Kirill_Good
сообщение Aug 23 2012, 13:07
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 217
Регистрация: 10-12-10
Из: Москва
Пользователь №: 61 528



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


#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");
...
}

Не знаю как в памяти всё это размещается.

Сообщение отредактировал Kirill_Good - Aug 23 2012, 13:08
Go to the top of the page
 
+Quote Post
gemuz
сообщение Oct 10 2013, 09:59
Сообщение #14


Частый гость
**

Группа: Свой
Сообщений: 107
Регистрация: 30-09-13
Пользователь №: 78 537



Цитата(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 запускается и сразу завершается и так далее. С приложением все нормально.

Поможет кто?

Спасибо!


Добрый день, думаю вопрос решиться при помощи: этого
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th July 2025 - 07:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01515 секунд с 7
ELECTRONIX ©2004-2016