Назад | Перейти на главную страницу

Отправка сообщения на сервер через сокет при запуске с помощью Upstart

Проблема

Мне нужно отправить сообщение на сервер через TCP-сокет во время запуска компьютера. Мы используем Ubuntu 14.04 и поэтому по умолчанию должны использовать Upstart в качестве инициализации системы. (У нас также есть другие компьютеры под управлением Ubuntu 16.04, которые могут использовать systemd, поэтому я стараюсь хранить сценарии оболочки отдельно от файла инициализации системы)

Текущее решение

В настоящее время я использую два файла для клиентов: файл выскочки .conf и файл сценария оболочки.

Файл выскочки

Файл выскочки (назовем его foo.conf) имеет следующее содержимое:


#!upstart
description "Send Message on Startup"

start on (local-filesystems
        and net-device-up
        and runlevel [2345])

exec /opt/foo/foo.sh

Файл оболочки

Файл оболочки (назовем его foo.sh) имеет следующее содержимое


#!/bin/bash

echo "Sending update message..."
echo "Message" | nc server-hostname 9999
echo "Completed sending update message."

Симптомы

Когда я перезагружаю компьютер, на котором есть эти файлы, я получаю в файле журнала следующее:


Sending update message...
Completed sending update message.

Однако сервер никогда не получает сообщение.

Вопрос

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

ОБНОВЛЕНИЕ: файл systemd

Вот подробности файла служебной единицы systemd, который я развернул на Ubuntu 16.04. Этот работает при каждой перезагрузке.


[Unit]
Description=Send Message on Startup
After=network-online.target

[Service]
Type=oneshot
ExecStart=/opt/foo/foo.sh

[Install]
WantedBy=multi-user.target

Попробуй это:

#!upstart
description "Send Message on Startup"

start on (local-filesystems
        and net-device-up IFACE!=lo
        and runlevel [2345])

Вот еще один вариант, который должен решить эту проблему. В основном подождите, пока он не ответит на пинг.

#!/bin/bash

server_hostname='server_hostname'
ping -c 2 $server_hostname
while [ $? -ne 0 ]
do
  echo 'Waiting for server...'
  sleep 2
  ping -c 2 $server_hostname
done

echo "Sending update message..."
echo "Message" | nc server-hostname 9999
echo "Completed sending update message."