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/scripti 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.shumieszczona 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 $0testamentu 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, tstto uruchomienie ./tstpowinno 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 $PATHskryptu.
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/firstbooti skrypt poinstalacyjny, który używa go update-rc.ddo 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-initdo tego celu.
Podczas uruchamiania nowej instancji EC2 można zdefiniować opcję User dataponiżej Advanced datails. Jeśli cloud-initumieś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-initmoż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
$0jest 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