Мне нужно отправить сообщение на сервер через 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, который я развернул на 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."