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

Vat*_*hul 2 cron amazon-web-services cloud-init aws-sdk

我正在尝试添加一个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
Run Code Online (Sandbox Code Playgroud)

从aws-terminal运行时,所有这些步骤均正常工作,在cloud-init-logs中也没有步骤失败。我第一次能够获得云监视指标,但之后却无法通过,因此这意味着crontab无法正常工作,该如何解决?

k_v*_*ath 6

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

crontab<<EOF
* * * * * script.sh
EOF
Run Code Online (Sandbox Code Playgroud)

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

crontab<<EOF
$(crontab -l)
* * * * * script2.sh
EOF
Run Code Online (Sandbox Code Playgroud)

现在列出 crontab 使用

crontab -l
Run Code Online (Sandbox Code Playgroud)

此外,手册页说每个用户都可以拥有自己的 crontab,尽管这些文件位于 /var/spool/cron 中,但不能直接编辑它们。

例如,如果您以 root 用户身份创建 cron,则相应用户的 cron 文件将是

/var/spool/cron/root
Run Code Online (Sandbox Code Playgroud)

详细请看下面

[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 ~]#
Run Code Online (Sandbox Code Playgroud)

在你的情况下,它看起来像

#!/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
Run Code Online (Sandbox Code Playgroud)


Ban*_*omi 5

不要使用-e,因为那是编辑模式,您需要

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