我使用以下命令启动实例:
gcutil addinstance \
--image=debian-7 \
--persistent_boot_disk \
--zone=us-central1-a \
--machine_type=n1-standard-1 \
--metadata_from_file=startup-script:install.sh \
instance-name
如何检测此实例何时完成安装脚本?我希望能够将此启动命令放在更大的配置脚本中,然后继续向服务器发出依赖于已成功完成安装脚本的命令。
答案 0 :(得分:1)
我不知道如何在gcutil addinstance
内完成所有这些工作。
我建议:
gcutil addinstance
添加实例,确保在继续之前使用--wait_until_running
标志确保实例正在运行gcutil push
gcutil ssh <instance-name> </path-to-script/script-to-run>
手动运行脚本。这样,您可以编写脚本,直到它完成为止,并且在远程计算机上的脚本执行完毕之前,ssh命令不会返回。
答案 1 :(得分:1)
有多种方法:给自己发送电子邮件,上传到云存储,发送jabber消息,......
一种简单的,可观察的方式恕我直言,在logger
脚本的末尾添加install.sh
条目(我还调整了对称的开头)。类似的东西:
#!/bin/bash
/usr/bin/logger "== Startup script START =="
#
# Your code goes here
#
/usr/bin/logger "== Startup script END =="
您可以通过两种方式检查脚本是否已开始或结束:
gcutil getserialportoutput instance-name
。答案 2 :(得分:1)
实现这一目标确实有很多方法。令我感到惊讶的是使用与实例关联的元数据服务器。让启动脚本将一段元数据设置为&#34; FINISHED&#34;脚本完成后。您可以使用挂起的GET查询metadata server,该挂起的GET仅在元数据更新时返回。只需使用gcutil setmetadata 从脚本中作为最后一个命令。
我喜欢这种方法,因为挂起的GET只给你一个命令来运行,而不是一个循环运行的轮询,并且除了Compute Engine之外它不涉及任何服务。
答案 3 :(得分:1)
另一种黑客方式:
startup_script_finished=false
while [[ "$startup_script_finished" = false ]]; do
pid=$(gcloud compute ssh $GCLOUD_USER@$GCLOUD_INSTANCE -- pgrep -f "\"/usr/bin/python /usr/bin/google_metadata_script_runner --script-type startup\"")
if [[ -z $pid ]]; then
startup_script_finished=true
else
sleep 2
fi
done
答案 4 :(得分:0)
一种可能的解决方案是让您的安装脚本在云存储桶中创建一个文本文件,作为最后一件事,使用主机名作为文件名。
执行原始gcutil addinstance命令的主脚本可以定期轮询存储桶的内容(使用gsutil ls),直到它看到具有匹配名称的文件,然后它就会知道安装已在该实例上完成。