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

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

   #!/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-терминала, также ни один шаг не завершается ошибкой в ​​журналах cloud-init-logs. В первый раз я могу получить метрики облачных часов, но после этого они не приходят, значит, crontab не работает, как это можно исправить?


person Vatsal Rahul    schedule 18.10.2018    source источник
comment
Это действительно сработало для сценария пользовательских данных: stackoverflow.com/a/52524986/1736679   -  person Efren    schedule 23.10.2019


Ответы (5)


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

  (crontab -l 2>/dev/null; echo "*/5 * * * * /path/to/job -with args") | crontab -
person Banjo Obayomi    schedule 18.10.2018
comment
удалить ) символ или добавить ( перед эхом - person k_vishwanath; 18.10.2018
comment
Я не понимаю использование первой команды, перенаправляющей поток ошибок на /dev/null. этого достаточно с вашей точки зрения. echo */5 * * * * /path/to/job -with args | кронтаб - - person k_vishwanath; 19.10.2018
comment
я не понял отсюда, что изменить в моем скрипте - person Vatsal Rahul; 19.10.2018

Вы также можете использовать 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
person k_vishwanath    schedule 18.10.2018
comment
Я пробовал подход отсюда, но все же это не сработало, если я передал его через скрипт пользовательских данных, хотя он работал, когда я пытался с терминала - person Vatsal Rahul; 19.10.2018
comment
возможно, вы делаете это неправильно. Отправьте сценарий пользовательских данных аккуратно. используйте приведенный выше синтаксис как есть. если он работает на терминале, он должен работать и в скрипте. см. мой обновленный ответ, и я также обновил блок кода вашего вопроса. - person k_vishwanath; 19.10.2018
comment
я обновил изменение, даже если вы также измените это на: - crontab‹‹EOF */1 * * * * ~/aws-scripts-mon/mon-put-instance-data.pl -mem-util --mem- используется --mem-avail --swap-util --disk-space-util --disk-space-used --disk-space-avail --memory-units=мегабайты --disk-path=/dev/xvda1 - -from-cron EOF, в вашем случае неверна только эхо-строка, остальная строка такая же, которую вы должны удалить, и да, она все еще не работает - person Vatsal Rahul; 19.10.2018

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

Я пытался автоматизировать добавление cronjob в ec2, чтобы мне не приходилось вручную планировать задание или добавлять скрипт. все это было сделано через пользовательские данные в cloudformation. мое решение требовало, чтобы я использовал диспетчер систем. Возможно, вам придется сменить системного администратора на пользователя ec2.

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

crontab -u ssm-пользователь /путь/к/сценарию

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

person Evens    schedule 05.08.2019

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

судо су

crontab -u ec2-пользователь -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

person Vatsal Rahul    schedule 23.10.2018

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

# !/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'
person manjuvreddy    schedule 11.02.2020