Czy w Ubuntu istnieje idiomatyczny sposób uruchamiania skryptu tylko przy pierwszym uruchomieniu komputera? (EC2).
Czy w Ubuntu istnieje idiomatyczny sposób uruchamiania skryptu tylko przy pierwszym uruchomieniu komputera? (EC2).
Odpowiedzi:
Nie. Możesz jednak umieścić skrypt /etc/init.d/script
i samodzielnie go usunąć:
#!/bin/bash
echo "Bump! I'm your first-boot script."
# Delete me
rm $0
Utwórz plik śledzenia po uruchomieniu skryptu. Jeśli plik już istnieje, zamknij skrypt.
Łą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
#! / bin / bash FLAG = "/ var / log / firstboot.log" Jeśli [ ! -f $ FLAGA]; następnie # Tutaj umieść zdania inicjujące echo „To jest pierwszy rozruch” # następny wiersz tworzy pusty plik, więc nie uruchomi następnego rozruchu dotknij $ FLAG jeszcze echo „Nic nie rób” fi
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:
#!/bin/bash
rm $0
echo "I've removed myself: $0"
ls -l $0
cat <<COMMENTARY
This is a test.
I'm still here, because the "here" doc is being fed to 'cat'
via the anonymous file through the open file descriptor.
But I cannot be re-exec'd
COMMENTARY
exec $0
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:
$ ./tst
I've removed myself: ./tst
ls: ./tst: No such file or directory
This is a test.
I'm still here, because the "here" doc is being fed to 'cat'
via the anonymous file through the open file descriptor.
But I cannot be re-exec'd
./tst: line 11: /home/jimd/bin/tst: No such file or directory
./tst: line 11: exec: /home/jimd/bin/tst: cannot execute: No such file or directory
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 go update-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
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żej Advanced datails
. Jeśli cloud-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
:
#cloud-config
runcmd:
- /usr/bin/command1.sh
- /usr/bin/command2.sh
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
$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