Czy w Ubuntu istnieje idiomatyczny sposób uruchamiania skryptu tylko przy pierwszym uruchomieniu komputera? (EC2).
boot
scripts
amazon-ec2
Roberto Aloi
źródło
źródło
$0
jest specyficzny dla bash (wersja> = 3). Dla celów kompatybilności możesz zamiast tego podać nazwę pliku skryptu, dzięki czemu będzie to mniej ogólne:rm /etc/init.d/script
Utwórz plik śledzenia po uruchomieniu skryptu. Jeśli plik już istnieje, zamknij skrypt.
źródło
Łączenie dwóch pierwszych odpowiedzi Zakładając, że nazwa skryptu jest
/usr/local/bin/firstboot.sh
umieszczona na końcu/etc/rc.local
(skrypty te działają przy każdym uruchomieniu), skrypty działają w ten sposóbźródło
Jestem zaskoczony wynikami, które widzę w poszukiwaniu dobrze zdefiniowanego i obsługiwanego haka „pierwszego rozruchu” Ubuntu. Wygląda na to, że tłum Red Hat / Fedora / CentOS ma to już od ponad dekady. Najbliższym odpowiednikiem Ubuntu wydaje się być oem-config-firstboot .
Pomysł zwykłego wykonania
rm $0
testamentu zadziała. Ale technicznie wiąże się to z interesującą semantyką. W przeciwieństwie do większości innych interpretatorów skryptów w systemie Unix, skrypt powłoki jest odczytywany i przetwarzany po jednym wierszu / instrukcji na raz. Jeśli odłączysz (rm
) plik spod niego, wówczas instancja powłoki przetwarzającej ten skrypt działa teraz z plikiem anonimowym (dowolnym plikiem, który jest otwarty, ale nie jest rozłączony).Rozważ taki plik:
Jeśli zapiszesz to w czymś takim
rmself.sh
(i (twardym)) linku do czegoś takiego,tst
to uruchomienie./tst
powinno pokazać coś takiego jako wynik:Teraz istnieje kilka dziwnych możliwych przypadków narożnych w odniesieniu do dowiązań symbolicznych i przypadków, w których skrypt został wywołany jako czysta nazwa (zmuszając powłokę do wyszukiwania
$PATH
skryptu.Wygląda jednak na to, że
bash
(przynajmniej w wersji 3.2) poprzedza$0
ścieżkę, jeśli przeszukała ścieżkę i pozostawia 0 $ ustawioną na ścieżkę względną lub bezwzględną użytą do wywołania skryptu. Wydaje się, że nie wykonuje żadnych ścieżek względnych normalizacji ani rozdzielczości ani dowiązań symbolicznych.Prawdopodobnie najczystszym „pierwszym uruchomieniem” dla Ubuntu byłoby utworzenie małego pakietu (.deb) zawierającego skrypt do umieszczenia w nim
/etc/init.d/firstboot
i skrypt poinstalacyjny, który używa goupdate-rc.d
do połączenia z poziomem uruchamiania 1 (/etc/rc1.d
) (używając polecenia takiego jak:)update-rc.d firstboot defaults
. .., a następnie niech ostatnia linia wykona dezaktywację lub usunie używając czegoś takiego:update-rc.d firstboot disable
Oto link do Debiana update-rc.d HOWTO
źródło
Możesz wykonać kopię zapasową bieżącego rc.local do rc.local.bak
Następnie możesz mieć rzeczy, które chcesz robić w rc.local, a na koniec po prostu mv /etc/rc.loca.bak /etc/rc.local.
źródło
Pytanie dotyczyło uruchomienia skryptu przy pierwszym uruchomieniu EC2. Możesz użyć
cloud-init
do tego celu.Podczas uruchamiania nowej instancji EC2 można zdefiniować opcję
User data
poniżejAdvanced datails
. Jeślicloud-init
umieścisz tam skrypt, zostanie on wykonany tylko przy pierwszym uruchomieniu.Na przykład możesz umieścić następujące elementy
User data
:Dane wyjściowe zostaną zapisane
/var/log/cloud-init-output.log
Cloud-init
może zrobić znacznie więcej niż to. Jest zaprojektowany specjalnie do przeprowadzania wczesnej inicjalizacji instancji chmury. Zobacz dokumenty tutaj: http://cloudinit.readthedocs.io/en/latest/index.htmlźródło