Есть ли в Ubuntu идиоматический способ запуска скрипта только при первой загрузке машины? (EC2).
boot
scripts
amazon-ec2
Роберто Алои
источник
источник
$0
зависит от bash (версия> = 3). В целях совместимости вы можете вместо этогоrm /etc/init.d/script
Создайте файл отслеживания при запуске скрипта. Если файл уже существует, выйдите из сценария.
источник
Объединение первых двух ответов. Предполагая, что вы называете свой скрипт,
/usr/local/bin/firstboot.sh
ставьте его в конце/etc/rc.local
(эти скрипты запускаются при каждой загрузке).источник
Я удивлен результатами, которые я вижу при поиске четко определенного и поддерживаемого хука Ubuntu «первая загрузка». Похоже, толпа Red Hat / Fedora / CentOS уже более десяти лет добивается этого. Ближайший эквивалент Ubuntu - oem-config-firstboot .
Идея просто выполнить
rm $0
работу воли. Но, технически, есть некоторая интересная семантика. В отличие от большинства других интерпретаторов сценариев в Unix, сценарий оболочки читается и обрабатывается по одной строке / инструкции за раз. Если вы отсоедините (rm
) файл из-под него, то экземпляр оболочки, который обрабатывает этот сценарий, теперь работает с анонимным файлом (любой файл, который открыт, но не связан).Рассмотрим такой файл:
Если вы сохраните это в нечто подобное
rmself.sh
и (жесткую) ссылку, что во что-то вроде этого,tst
то при запуске./tst
должно отобразиться что-то вроде этого:Теперь есть несколько странных возможных угловых случаев в отношении символических ссылок и случаев, когда скрипт вызывался как голое имя (что заставляло оболочку искать
$PATH
скрипт.Но кажется, что
bash
(по крайней мере в версии 3.2) предшествует$0
путь, если он искал путь, и в противном случае оставляет $ 0 установленным для любого относительного или абсолютного пути, использованного для вызова скрипта. Кажется, он не делает ни нормализации или разрешения относительных путей, ни символических ссылок.Вероятно, самой чистой «первой загрузкой» для Ubuntu было бы создать небольшой пакет (.deb), содержащий сценарий для размещения
/etc/init.d/firstboot
и сценарий после установки, который используетсяupdate-rc.d
для связывания этого с уровнем запуска 1 (/etc/rc1.d
) (с помощью команды вроде:)update-rc.d firstboot defaults
. .. а затем попросите последнюю строку выполнить деактивацию или удалить что-то вроде:update-rc.d firstboot disable
Вот ссылка на Debian update-rc.d HOWTO
источник
Вы можете сделать резервную копию текущего rc.local в rc.local.bak
Затем вы можете получить то, что хотите сделать в rc.local, а в конце просто mv /etc/rc.loca.bak /etc/rc.local.
источник
Вопрос был о запуске скрипта при первой загрузке EC2. Вы можете использовать
cloud-init
для этой цели.При запуске нового экземпляра EC2 у вас есть возможность определить
User data
подAdvanced datails
. Если вы разместитеcloud-init
скрипт там, он будет выполнен только при первой загрузке.Например, вы можете разместить следующее в
User data
:Вывод будет записан в
/var/log/cloud-init-output.log
Cloud-init
может сделать гораздо больше, чем это. Он разработан специально для ранней инициализации облачных экземпляров. Смотрите документы здесь: http://cloudinit.readthedocs.io/en/latest/index.htmlисточник