Uruchom skrypt tylko przy pierwszym uruchomieniu


Odpowiedzi:


14

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

Uwaga: $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
Andrejs Cainikovs

4
0 USD NIE jest specyficzne dla basha i było obsługiwane znacznie dłużej niż bash 3.x (i jest obsługiwane w Bourne, Korn, zsh i innych). Punktem spornym jest to, czy 0 $ zawiera pełną lub względną specyfikację ścieżki. Oto link do niezawodnego sposobu uzyskania pełnej ścieżki, jeśli jej potrzebujesz: stackoverflow.com/questions/4774054/…
Jim Dennis

7

Utwórz plik śledzenia po uruchomieniu skryptu. Jeśli plik już istnieje, zamknij skrypt.


4
Choć na pierwszy rzut oka może się to nie wydawać, może to być lepsze rozwiązanie niż usunięcie skryptu, ponieważ zachowuje on możliwość ponownego uruchomienia go, jeśli kiedykolwiek zechcesz.
msanford,

7

Łą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

To niekoniecznie działa z sysmtemd. Muszę dodać uśpienie 20, aby upewnić się, że jest to ostatnie uruchomienie skryptu.
mrossi

Jeśli nazwiesz go /etc/rc.local/99-firstboot.sh, powinien on działać jako ostatni.
JohnDavid

3

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


0

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.


0

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.