我正在尝试添加一个 crontab,以便我可以通过用户数据脚本每 5 分钟获取已用磁盘空间和磁盘空间利用率的 CloudWatch 指标。 以下是我的用户数据脚本:
#!/bin/bash
sudo yum install -y perl-Switch perl-DateTime perl-Sys-Syslog perl-LWP-Protocol-https perl-Digest-SHA.x86_64
curl https://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.2.zip -O
unzip CloudWatchMonitoringScripts-1.2.2.zip && rm CloudWatchMonitoringScripts-1.2.2.zip && cd aws-scripts-mon
crontab<<EOF
*/1 * * * * ~/aws-scripts-mon/mon-put-instance-data.pl -mem-util --mem-used --mem-avail --swap-util --disk-space-util --disk-space-used --disk-space-avail --memory-units=megabytes --disk-path=/dev/xvda1 --from-cron
EOF
./mon-put-instance-data.pl -mem-util --mem-used --mem-avail --swap-util --disk-space-util --disk-space-used --disk-space-avail --memory-units=megabytes --disk-path=/dev/xvda1
从 aws-terminal 运行时,所有这些步骤都可以正常工作, cloud-init-logs 中也没有任何步骤失败。第一次我能够获取云监视指标,但之后,它们就没有通过,所以这意味着 crontab 不起作用,如何解决这个问题?
不要使用-e,因为那是编辑模式,你想要类似的东西:
(crontab -l 2>/dev/null || echo ""; echo "*/5 * * * * /path/to/job -with args") | crontab -
更新:添加了空回显管道,以避免由于缺少 root 的 crontab 列表(用户数据的默认运行用户)而导致用户数据停止,这将返回非零并使脚本失败。
注意:另请注意,Userdata 默认情况下仅运行一次,而不是每次重新启动实例时运行。因此,在实例停止时更改用户数据不允许您测试不同的方法,除非您按照此文档进行修改。如果设置为每次运行,上面的脚本也会一遍又一遍地将相同的规则连接到 crontab!
您还可以使用heredoc以更简洁的方式实现此目的
crontab<<EOF
* * * * * script.sh
EOF
如果您想附加到现有的 crontab,请执行以下操作
crontab<<EOF
$(crontab -l)
* * * * * script2.sh
EOF
现在使用
列出 crontabcrontab -l
另外,手册页说每个用户都可以有自己的 crontab,尽管这些文件位于 /var/spool/cron 中,但不适合直接编辑。
例如如果您以 root 用户身份创建 cron,则相应用户的 cron 文件将为
/var/spool/cron/root
详细请看下文
[root@localhost ~]# crontab -l
no crontab for root
[root@localhost ~]# crontab<<EOF
*/5 * * * * script1.sh
EOF
[root@localhost ~]# crontab -l
*/5 * * * * script1.sh
[root@localhost ~]# crontab<<EOF
*/10 * * * * script2.sh
EOF
[root@localhost ~]# crontab -l
*/10 * * * * script2.sh
[root@localhost ~]# crontab<<EOF
$(crontab -l)
* * * * * script3.sh
EOF
[root@localhost ~]# crontab -l
*/10 * * * * script2.sh
* * * * * script3.sh
[root@localhost ~]# crontab<<EOF
$(crontab -l)
* * * * * script4.sh
EOF
[root@localhost ~]# crontab -l
*/10 * * * * script2.sh
* * * * * script3.sh
* * * * * script4.sh
[root@localhost ~]# cat /var/spool/cron/root
*/10 * * * * script2.sh
* * * * * script3.sh
* * * * * script4.sh
[root@localhost ~]#
在你的情况下,它看起来像
#!/bin/bash
sudo yum install -y perl-Switch perl-DateTime perl-Sys-Syslog perl-LWP-Protocol-https perl-Digest-SHA.x86_64
curl https://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.2.zip -O
unzip CloudWatchMonitoringScripts-1.2.2.zip && rm CloudWatchMonitoringScripts-1.2.2.zip && cd aws-scripts-mon
crontab<<EOF
echo $'i*/5 * * * * ~/aws-scripts-mon/mon-put-instance-data.pl -mem-util --mem-used --mem-avail --swap-util --disk-space-util --disk-space-used --disk-space-avail --memory-units=megabytes --disk-path=/dev/xvda1 --from-cron\E:x\n'
EOF
./mon-put-instance-data.pl -mem-util --mem-used --mem-avail --swap-util --disk-space-util --disk-space-used --disk-space-avail --memory-units=megabytes --disk-path=/dev/xvda1
这篇文章很旧,但我花了太长时间才找到这个解决方案。
我试图自动将 cronjob 添加到 ec2,这样我就不必手动安排作业或添加脚本。所有这一切都是通过云信息中的用户数据完成的。我的解决方案要求我使用系统管理器。您可能需要将系统管理员更改为 ec2-user。
为此,我使用了:
crontab -u ssm-user /路径/到/脚本
我尝试了 5 个其他解决方案,这些解决方案在控制台中有效,但在用户数据中不起作用。我真的希望这可以帮助其他人将来实现部署自动化
为了在 crontab 中添加行,我在用户数据脚本中使用了这些行,它对我来说效果很好
须藤苏
crontab -u ec2-user -l
echo -e "*/5 * * * * ~/aws-scripts-mon/mon-put-instance-data.pl -mem-util --mem-used --mem-avail --swap-util -- disk-space-util --disk-space-used --disk-space-avail --memory-units=megabytes --disk-path=/dev/xvda1 --from-cron " | crontab -u ec2-用户 -
退出
帮助我找到解决方案的链接是https://serverfault.com/questions/296949/programmatically-add-entry-to-users-crontab
我遇到了类似的问题,就像其他人在这里所说的那样,这些命令在 CLI 中工作正常,但通过 userdata 添加时不起作用。经过几个小时的绞尽脑汁的搜索后终于意识到我必须在 crontab 设置命令之前添加行 "#!/bin/bash" 。这解决了我的问题,一些经验丰富的人可能已经知道这一点,但如果您对这个领域有点陌生,可能不知道这一点。我的脚本如下所示。
# !/bin/bash
sudo su
echo '*/1 * * * * <path-to-python> <path-to-python-script>' > /tmp/mycrontab.txt
sudo -u ubuntu bash -c 'crontab /tmp/mycrontab.txt'
这已经很老了,但还没有人发布过,这可能是更正确的解决方案。
echo '*/1 * * * * ec2-user ~/aws-scripts-mon/mon-put-instance-data.pl -mem-util --mem-used --mem-avail --swap-util --disk-space-util --disk-space-used --disk-space-avail --memory-units=megabytes --disk-path=/dev/xvda1 --from-cron' > /etc/cron.d/mon-put-instance-data
https://linuxize.com/post/scheduling-cron-jobs-with-crontab/#system-wide-crontab-files