Перейти к содержанию
    

Автоматический запуск приложения при загрузке Linux

Добрый день!

 

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

 

Поможет кто?

 

Спасибо!

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Абы какие скрипты в /etc/init.d класть нельзя. Они должны удовлетворять некоторому шаблону. Посмотрите, как устроен любой скрипт из этого каталога.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Дистрибутив : Angstrom.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

Я бы добавил в самое начало приложения что-то вроде

fprintf(stderr, "Application %s started, %s %s\n", APP_NAME, __DATE__, __TIME__);

Тогда будет видно в чем именно проблема, что приложение не запустилось, или оно запустилось, но работает не так как ожидалось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Абы какие скрипты в /etc/init.d класть нельзя. Они должны удовлетворять некоторому шаблону. Посмотрите, как устроен любой скрипт из этого каталога.

Не правда. Иниту не важно что внутри скрипта, главное чтобы был исполняемым и шабанг (#!/bin/sh) присутствовал. start/stop и пр. - это удобства http://www.debian-administration.org/articles/28

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

Я бы добавил в самое начало приложения что-то вроде

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));

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

 

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

 

Изменено пользователем Kirill_Good

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

/home/root/app 2 > /home/report.txt

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

Изменено пользователем _Pasha

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

/home/root/app 2 > /home/report.txt

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

 

Делал так, файл пустой был. Правда вывода строки сразу после main не делал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, но что Вам дадут дата и время сборки приложения? Тогда уж

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

 

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

stderr не буферизирован, stdout буферизирован.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Делал так, файл пустой был. Правда вывода строки сразу после main не делал.

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

Изменено пользователем _Pasha

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

тестовый бинарник :

int main() {

fprintf(stderr, "Hello!\n");

while(1)

{sleep(1);}

}

 

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

 

бинарник который нужно запустить :

int main() {

fprintf(stderr, "Hello!\n");

while(1)

{sleep(1);}

...

}

 

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

Скомпилированы одним компилятором.

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

 

#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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день!

 

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

 

Поможет кто?

 

Спасибо!

 

Добрый день, думаю вопрос решиться при помощи: этого

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...