如何通过aws ec2中的用户数据脚本添加crontab调度程序?

问题描述 投票:0回答:6

我正在尝试添加一个 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 不起作用,如何解决这个问题?

amazon-web-services cron aws-sdk cloud-init
6个回答
11
投票

不要使用-e,因为那是编辑模式,你想要类似的东西:

  (crontab -l 2>/dev/null || echo ""; echo "*/5 * * * * /path/to/job -with args") | crontab -

更新:添加了空回显管道,以避免由于缺少 root 的 crontab 列表(用户数据的默认运行用户)而导致用户数据停止,这将返回非零并使脚本失败。

注意:另请注意,Userdata 默认情况下仅运行一次,而不是每次重新启动实例时运行。因此,在实例停止时更改用户数据不允许您测试不同的方法,除非您按照此文档进行修改。如果设置为每次运行,上面的脚本也会一遍又一遍地将相同的规则连接到 crontab!


10
投票

您还可以使用heredoc以更简洁的方式实现此目的

crontab<<EOF
* * * * * script.sh
EOF

如果您想附加到现有的 crontab,请执行以下操作

crontab<<EOF
$(crontab -l)
* * * * * script2.sh
EOF

现在使用

列出 crontab
crontab -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

3
投票

这篇文章很旧,但我花了太长时间才找到这个解决方案。

我试图自动将 cronjob 添加到 ec2,这样我就不必手动安排作业或添加脚本。所有这一切都是通过云信息中的用户数据完成的。我的解决方案要求我使用系统管理器。您可能需要将系统管理员更改为 ec2-user。

为此,我使用了:

crontab -u ssm-user /路径/到/脚本

我尝试了 5 个其他解决方案,这些解决方案在控制台中有效,但在用户数据中不起作用。我真的希望这可以帮助其他人将来实现部署自动化


1
投票

为了在 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


1
投票

我遇到了类似的问题,就像其他人在这里所说的那样,这些命令在 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'

0
投票

这已经很老了,但还没有人发布过,这可能是更正确的解决方案。

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

© www.soinside.com 2019 - 2024. All rights reserved.