我正在尝试在实例启动时配置与特定AWS SQS自动通信的EC2实例。为此,我编写了一个systemd启动脚本,它将执行shell脚本。
[Unit]
Description=NewUnit
[Service]
ExecStart=/usr/local/bin/startup_script.sh
[Install]
WantedBy=default.target
shell脚本基本上可以测量实例的CPU使用率,并将此信息发送到队列。使我的计划失败的关键部分是我尝试调用aws cli函数“ send-message”的行:
while true; do
CONTENT='{"vmid":{"DataType":"String","StringValue":"'$(getEC2ID)'"},"vmcpu":{"DataType":"Number","StringValue":"'$(getCPU)'"},"vmmemory":{"DataType":"Number","StringValue":"'$(getMemory)'"},"vmdisk":{"DataType":"Number","StringValue":"12345"}}'
aws sqs send-message \
--queue-url "$QUEUE_URL" \
--message-body "$CONTENT" \
--message-group-id "$GROUP_ID" \
--message-deduplication-id "$(getID)" \
# --message-attributes "$CONTENT" \ || echo "not yet" >>/usr/local/bin/startup_report.txt
done
我想问题是执行脚本时awscli尚未准备好。因此,我现在的问题是:如何使用systemd等待awscli之后执行此shell脚本?
答案 0 :(得分:1)
您编写服务文件的方式未指定任何顺序或要求。这使得systemd可以随时运行它。特别是,这可能需要很长时间才能建立网络,就像我的脚本使用aws cli一样。在文件的“单元”部分添加以下指令:
After=network.target
...将使其在网络启动后运行。如果这对您不起作用,那么您可能想要将其更改为:
After=network-online.target
...这应确保脚本运行时完全网络运行。