Сервис, Демон, Автозагрузка .... Какой правильный путь?

285
poor_red_neck

Я думаю, что у меня есть неполная терминологическая проблема, частично простая проблема новичка, частично усталая от проблемы чтения.

До сих пор я работал над проектом домашнего энергомонитора: с работы моего SDR-радио, декодирования данных, передачи json в InfluxDB, запуска Grafana и получения графиков! В течение всего периода поиска в Google, поскольку у меня есть опыт работы с Linux менее 2 месяцев (просто играю с Raspberry Pi / OrangePi.

Мой OrangePi работает под управлением Armbian Ubuntu 16.04

Мне нужна очень простая «команда» для выполнения при загрузке. Он будет работать все время в фоновом режиме. Итак, я думаю, что делает его демоном? Команда

/home/jonboy545/GoCode/bin/rtlamr -filterid=62059972 -format=json -msgtype=idm unique=true | rtlamr-collect 

Вот и все. Я сделал простой скрипт с именем log_energy.sh и сделал его исполняемым. Это просто:

#!/bin/bashr /home/jonboy545/GoCode/bin/rtlamr -filterid=62059972 -format=json -msgtype=idm unique=true | rtlamr-collect; 

Если я введу ./log_energy.sh в окно терминала, все прекрасно работает. Я должен открыть экземпляр SCREEN, чтобы отсоединить его, чтобы не оставлять терминал открытым. Очевидно, это не лучшее решение.

Итак, я помещаю это в rc.local? У меня были некоторые проблемы, я думаю, что это выполняется слишком рано, поэтому я попытался поставить там сон 60, но это все еще было спорадическим. Иногда это работало, иногда нет. Поэтому я подумал об использовании crontab и просто заставил его выполнить @reboot. Опять же, вероятно, не лучшее решение. Также есть переменные окружения, которые должны быть объявлены и установлены в ~ / .profile (я думаю, они могут пойти куда угодно), и я не уверен, что crontab «читает» эти переменные окружения, по крайней мере, это то, что я прочитал.

Итак, каков «правильный» способ выполнения этого скрипта при загрузке (возможно, в самом конце, когда все «успокоится»).

В конечном счете, я бы хотел, чтобы это был «сервис» под названием energylog, чтобы я мог запускать / останавливать / перезапускать сервис sudo.

Я посмотрел на /etc/init.d/skeleton, а также на некоторые уже существующие файлы в /etc/init.d, но я не совсем уверен, на что смотрю.

Может ли кто-нибудь направить меня в правильном направлении?

Большое спасибо!

-1

1 ответ на вопрос

3
Journeyman Geek

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

Демон что - то вроде старой DOS ТМР - ее приложение, которое началось и работает в фоновом режиме.

«Классические» способы сделать это с помощью сценария инициализации (который, как правило, немного сложен в написании) - но они несколько устарели, или crontab - который буквально просто вещь, предназначенная для запуска определенных задач одновременно.

Команда service ссылается на upstart, который обрабатывает то, что сделали сценарии инициализации, но с 16.04 ее заменяет systemd. Он используется для systemd для людей, переходящих с upstart, но стоит заменить «service» на «systemctl» - что делает то же самое и многое другое.

Напишите свой скрипт для systemd.

Зачем? Его поддерживают, и будет в долгосрочной перспективе. У него довольно разумный синтаксис. Документация тоже на самом деле довольно приличная.

Также есть переменные окружения, которые должны быть объявлены и установлены в ~ / .profile (я думаю, они могут пойти куда угодно), и я не уверен, что crontab «читает» эти переменные окружения, по крайней мере, это то, что я прочитал.

Согласно документации systemd (и для дальнейшего чтения - этот вопрос AU и документация Ubuntu )

Вы можете добавить строку с переменными среды с такой строкой, как

Окружающая среда = "ОДИН = один" "ДВА = два два"

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