我需要一些跨点终端的持久存储。
我解决问题的方法是
编写一个启动脚本来连接并挂载持久卷
对此状态进行快照并注册私有 AMI
基于私有 AMI 启动 Spot 实例
在此论坛中搜索 [1] 表明这是正确的程序
我的启动脚本:
#!/bin/sh
echo "executing startup script"
# attach the EBS volume to this machine
aws ec2 attach-volume --volume-id vol-7bef1d96 --instance-id $(wget -q -O - http://169.254.169.254/latest/meta-data/instance-id ) --device /dev/xvdg
sleep 10
# mount the attached EBS volume
echo "mounting the attached volume"
sudo mount /dev/xvdg1 /home/ubuntu/persistent/
#run script
echo "starting the dummy program in background"
python2 persistent/dummyProgram.py &
如果手动执行,该脚本可以完美运行。但是,当通过 cron 执行时,只会执行 echo 语句
crontab 任务是
@reboot /path/to/startupScript.sh
我该如何解决这个问题?
更正后的 crontab 条目如下:
USER=username
PATH=content of $PATH
@reboot /path/to/startupScript.sh
答案1
从 crontab 脚本调用时命令无法运行的最可能原因是它们不在 PATH 环境变量中。默认情况下,crontab 条目使用一组最少的环境变量运行。
答案2
虽然cron
肯定能完成工作,但规范的方法是指定user-data
在启动 Spot 实例时运行的脚本。request-spot-instance
使用 AWS CLI 的参数在 JSON 中指定--launch-specification
。
http://docs.aws.amazon.com/cli/latest/reference/ec2/request-spot-instances.html
此部分可以是一个小的 shell 脚本,并允许您更改卷 ID是否有必要这样做,而不是将其硬编码到 AMI 中。