Как добавить планировщик 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