我正在从 AWS(Amazon Web Services)上的 AMI(Amazon 系统映像)启动计算机,并希望从文件动态加载 crontab,而不是使用 AMI 的 crontab。我想到的一种方法是将 AMI 的 crontab 设置为:
@reboot crontab [CRONTAB_FILE]
这种方法的问题是 CRONTAB_FILE 中的 @reboot 计划不会使用它来运行。
还有其他方法可以实现这一目标吗?有什么方法可以在守护进程启动之前更改 crontab 吗?
我的机器正在运行 Debian,如果这有什么区别的话。
答案1
我通常只是crontab -u user file
在 /etc/rc.local 之类的地方加载一个 cron 选项卡。除此之外,没有太多事可做。
我通常会做类似的事情:(在 rc.local 中)
wget http://169.254.169.254/latest/meta-data/instance-id -O /tmp/instance
INSTANCE=`cat /tmp/instance`
KEY="/etc/pk.pem"
CERT="/etc/cert.pem"
CONFIG=`ec2-describe-tags -K $KEY -C $CERT -F "resource-id=$INSTANCE" -F "key=ConfigBucket" | awk '{print $5}'`
if [ -n $CONFIG ]; then
s3cmd -c /etc/.s3cfg sync s3://$CONFIG/etc/ /etc
chmod +x /etc/post-ec2-start.sh
/etc/post-ec2-start.sh
fi
exit 0
然后在/etc/post-ec2-start.sh中
#!/bin/bash
wget http://169.254.169.254/latest/meta-data/instance-id -O /tmp/instance
INSTANCE=`cat /tmp/instance`
KEY="/etc/pk.pem"
CERT="/etc/cert.pem"
VOL1="vol-12345678"
VOL2="vol-87654321"
IP="54.123.123.132"
ec2-attach-volume -K $KEY -C $CERT $VOL1 -i "$INSTANCE" -d /dev/sdf
ec2-attach-volume -K $KEY -C $CERT $VOL2 -i "$INSTANCE" -d /dev/sdg
ec2-associate-address -K $KEY -C $CERT -i "$INSTANCE" $IP
sleep 90
mount /dev/sdf1 /home/
mount /dev/sdg1 /var/lib/mysql
hostname some.fqdn.com
#register crontabs
#crontab -u coteyr /etc/coteyr.crontab
crontab -u root /etc/root.crontab
#fix home directoris
cd /home/
for i in *; do
useradd $i
chown -R $i:$i /home/$i
done
这样做的好处是可以从 S3 加载配置,然后基于该配置运行。如果我需要在(重新)启动时运行一些东西,我只需将其添加到 /etc/post-ec2-start.sh 或 /etc/rc.local ,具体取决于我是否需要它作为设置配置的一部分或在配置完成。类似的东西应该对你有用。