-1

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

До сих пор я работал над проектом домашнего энергомонитора: с работы моего 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

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

Демон - это что-то вроде старого TOS для DOS - это приложение, которое запускается и работает в фоновом режиме.

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

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

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

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

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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .