Member 11296776 Ответов: 1

Соединение Tcpip отказано при использовании в качестве сервиса в raspbian


У меня есть jar-файл, который прослушивает запросы tcpip и отправляет соответствующие данные. этот файл jar должен работать на службе в raspbian.

я следовал инструкциям по этой ссылке

Я создал sh-файл и поместил его в /usr/local/bin (Tourmaline.sh):

#!/bin/sh
ИМЯ_СЛУЖБЫ=турмалин
PATH_TO_JAR=/usr/local/bin/Tourmaline.jar
PID_PATH_NAME=/tmp/Tourmaline-pid
случае $1 в
начало)
echo "запуск $SERVICE_NAME ..."
если [ ! -f $PID_PATH_NAME ]; то
старпома на Java -банку $PATH_TO_JAR /ТММ-2&ГТ;> /dev/нуль &ГТ;> /dev/нуль усилителя;
echo $! > $PID_PATH_NAME
echo "$SERVICE_NAME запущен ..."
еще
echo "$SERVICE_NAME уже запущен ..."
fi
;;
остановить)
if [ -f $PID_PATH_NAME ]; then
PID=$(cat $PID_PATH_NAME);
echo "$SERVICE_NAME stoping ..."
убить $PID;
echo "$SERVICE_NAME остановлено ..."
rm $PID_PATH_NAME
еще
echo "$SERVICE_NAME не работает ..."
fi
;;
перезапуск)
if [ -f $PID_PATH_NAME ]; then
PID=$(cat $PID_PATH_NAME);
echo "$SERVICE_NAME остановка ...";
убить $PID;
echo "$SERVICE_NAME остановлено ...";
rm $PID_PATH_NAME
echo "$SERVICE_NAME starting ..."
nohup и Ява -банку $PATH_TO_JAR /ТММ-2&ГТ;> /dev/нуль &ГТ;> /dev/нуль усилителя;
echo $! > $PID_PATH_NAME
echo "$SERVICE_NAME запущен ..."
еще
echo "$SERVICE_NAME не работает ..."
fi
;;
эсок

когда я запускаю "sudo Tourmaline.sh пуск" на терминале программа начинает работать, и когда я отправляю запрос, я получаю ответ.

это была фаза 1. Далее я создал скрипт сервиса и поместил его в файл /etc/systems/system (Tourmaline.service):

[Единица измерения]
Описание = Турмалин
После= сеть.цель

[Обслуживание]
Тип = разветвление
ExecStart = /usr/local/bin/Tourmaline.sh начало
ExecStop = /usr/local/bin/Tourmaline.sh стоп
ExecReload = /usr/local/bin/Tourmaline.sh перезарядка

[Устанавливать]
WantedBy=многопользовательский.target
Я включить использование "sudo systemctl включить турмалин" и начать его "команду sudo systemctl начать турмалин.услуги"

в статусе я вижу, что служба запущена и активна, однако, когда я отправляю запрос, я получаю ошибку "отказано в соединении", я пытаюсь запустить "sudo Tourmaline.sh начало", но там написано:

программа уже запущена (потому что служба запущена).



как я могу сделать так, чтобы служба принимала соединения?

Что я уже пробовал:

я использовал netstat -l, чтобы увидеть используемые порты:
когда я использую Tourmaline.service, никакой tcp не слушает
когда я использую Tourmaline.sh я получаю tcp6 0 0 [::]:формата rtcm-sc104 [::]:* слушать

1 Ответов

Рейтинг:
2

Jochen Arndt

Ваше Java-приложение не слушает при запуске systemd скрипт.

Такие приложения должны проверять наличие ошибок (здесь при создании прослушивающего сокета), выводить сообщение об ошибке и завершать работу с ненулевым возвращаемым значением при возникновении ошибок. Вызывающий скрипт должен проверить возвращаемое значение, очистить его и распечатать сообщение об ошибке.

Но это не решит саму проблему. Так почему же приложение работает при запуске вручную, а не при запуске во время загрузки в качестве службы?

Наверное, потому что сеть еще не заработала!

Вы уже использовали

[Unit]
Description = Tourmaline
After= network.target
чтобы запустить свой сервис после запуска сети. Но этого недостаточно, потому что настройка сети требует некоторого времени, пока интерфейсы не будут готовы.

Чтобы убедиться, что сеть работает, используйте
After=network-online.target
Wants=network-online.target
Смотреть также NetworkTarget[^].