Как добавить планировщик crontab через скрипт пользовательских данных в aws ec2?

Я пытаюсь добавить crontab, чтобы я мог получать метрики облачных часов об используемом дисковом пространстве и использовании дискового пространства каждые 5 минут с помощью скрипта пользовательских данных. Ниже мой скрипт пользовательских данных:

#! / bin / bash sudo yum install -y perl-Switch perl-DateTime perl-Sys-Syslog perl-LWP-протокол-https perl-Digest-SHA.x86_64 curl https://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.2.zip -O распаковать CloudWatchMonitoringScripts-1.2.2.zip && rm CloudWatchMonitoringScripts-1.2.2.zip && cd aws-scripts-mon

кронтаб <

./mon-put-instance-data.pl -mem-util --mem-used --mem-util --swap-util --disk-space-util --disk-space-used --disk-space- Свободно --memory-units= мегабайт --disk-path=/dev/xvda1

все эти шаги работают должным образом, если я пытаюсь сделать это из aws-терминала, также не происходит никаких шагов в cloud-init-logs, впервые я могу получить метрики наблюдения за облаком, но после этого я не могу получить, значит, crontab не работает, как это исправить?

6 ответов

Не используйте -e, так как это режим редактирования, вы хотите что-то вроде

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

Вы также можете использовать heredoc для достижения этого более чистым способом

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

И если вы хотите добавить в существующий crontab, сделайте следующее

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

Теперь перечислите crontab, используя

crontab -l

Кроме того, на странице руководства говорится, что у каждого пользователя может быть свой собственный crontab, и, хотя это файлы в /var/spool/cron, они не предназначены для непосредственного редактирования.

Например, если вы создаете cron как пользователь root, файл 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

Это старый пост, но я слишком долго искал это решение.

Я пытался автоматизировать добавление задания cron в ec2, чтобы мне не приходилось вручную планировать задание или добавлять скрипт. все это было сделано с помощью пользовательских данных в облачной информации. мое решение требовало, чтобы я использовал Системный менеджер. U может потребоваться сменить системного менеджера на пользователя ec2.

Для этого я использовал:

crontab -u ssm-user / путь / к / скрипту

Я пробовал как 5 других решений, которые работали в консоли, но не работали с пользовательскими данными. Я очень надеюсь, что это поможет другим автоматизировать развертывание в будущем.

Для добавления строк в crontab я использовал эти строки в моем скрипте пользовательских данных, и он работал нормально для меня

судо су

crontab -u ec2-пользователь -l

echo -e "* / 5 * * * * ~ / aws-scripts-mon / mon-put-instance-data.pl -mem-util --mem used --mem-util --swap-util --disk-space-util --disk-space-used --disk-space-util --memory-units= мегабайт --disk-path=/dev/xvda1 --from-cron " | crontab -u ec2-user -

выход

ссылка, которая помогает мне найти решение: https://serverfault.com/questions/296949/programmatically-add-entry-to-users-crontab

У меня была аналогичная проблема, как и другие, здесь говорят, что эти команды отлично работают из CLI, но при добавлении через пользовательские данные не работают. После нескольких часов поиска в голове, наконец, понял, что мне нужно добавить строку "#!/ Bin/bash" перед командами установки crontab. Это устранило мою проблему, некоторые очень опытные люди могут это уже знать, но если вы новичок в этой сфере, возможно, этого не знают. Мой сценарий выглядит так, как показано ниже.

! / bin / bash

sudo suecho '* / 1 * * * *'> /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

Другие вопросы по тегам