问题
我需要在计算机启动时通过 TCP 套接字向服务器发送消息。我们使用的是 Ubuntu 14.04,因此默认情况下必须使用 Upstart 作为系统初始化。(我们还有其他运行 Ubuntu 16.04 的计算机可以使用 systemd,因此我试图将 shell 脚本与系统初始化文件分开)
当前解决方案
目前我正在为客户端使用两个文件:一个 upstart .conf 文件和一个 shell 脚本文件。
Upstart 文件
upstart 文件(我们称之为 foo.conf)包含以下内容:
#!upstart
description "Send Message on Startup"
start on (local-filesystems
and net-device-up
and runlevel [2345])
exec /opt/foo/foo.sh
Shell 文件
shell 文件(我们称之为 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 上部署的 systemd 服务单元文件的详细信息。每次重启后,此文件都会起作用。
[Unit]
Description=Send Message on Startup
After=network-online.target
[Service]
Type=oneshot
ExecStart=/opt/foo/foo.sh
[Install]
WantedBy=multi-user.target
答案1
尝试这个:
#!upstart
description "Send Message on Startup"
start on (local-filesystems
and net-device-up IFACE!=lo
and runlevel [2345])
这是另一个应该可以解决问题的选项。基本上等到它响应 ping。
#!/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."