Gibt es in Ubuntu eine idiomatische Möglichkeit, ein Skript nur beim ersten Booten einer Maschine auszuführen? (EC2).
boot
scripts
amazon-ec2
Roberto Aloi
quelle
quelle
$0
bash-spezifisch ist (Version> = 3). Aus Kompatibilitätsgründen können Sie stattdessen den Namen derrm /etc/init.d/script
Erstellen Sie eine Tracking-Datei, wenn das Skript ausgeführt wird. Wenn die Datei bereits vorhanden ist, beenden Sie das Skript.
quelle
Kombinieren der ersten beiden Antworten Angenommen, Sie nennen Ihr Skript
/usr/local/bin/firstboot.sh
am Ende/etc/rc.local
(dieses Skript wird bei jedem Start ausgeführt)quelle
Ich bin überrascht über die Ergebnisse, die ich bei der Suche nach einem gut definierten und unterstützten Ubuntu "first boot" -Hook sehe. Scheint, als hätte die Red Hat / Fedora / CentOS-Menge dies seit über einem Jahrzehnt hinbekommen. Das nächste Ubuntu-Äquivalent scheint oem-config-firstboot zu sein .
Die Idee, einfach einen
rm $0
Willen auszuführen , funktioniert. Aber technisch gesehen gibt es einige interessante Semantiken. Im Gegensatz zu den meisten anderen Skript-Interpretern unter Unix wird ein Shell-Skript jeweils zeilenweise gelesen und verarbeitet. Wenn Sie die Verknüpfung (rm
) der Datei aufheben, funktioniert die Instanz der Shell, die dieses Skript verarbeitet, jetzt mit einer anonymen Datei (jede Datei, die geöffnet, aber nicht verknüpft ist).Betrachten Sie eine Datei wie diese:
Wenn Sie das auf so etwas speichern
rmself.sh
und (fest) mit so etwas verknüpfen, sollte beimtst
Ausführen./tst
Folgendes als Ausgabe angezeigt werden:Nun gibt es einige merkwürdige mögliche Eckfälle in Bezug auf Symlinks und Fälle, in denen das Skript als leerer Name aufgerufen wurde (was die Shell zwingt, nach
$PATH
dem Skript zu suchen) .Es scheint jedoch, dass
bash
(zumindest in Version 3.2)$0
der Pfad vorangestellt wird, wenn der Pfad durchsucht wird, und ansonsten $ 0 auf den relativen oder absoluten Pfad gesetzt bleibt, der zum Aufrufen des Skripts verwendet wurde. Es scheint keine Normalisierungs- oder Auflösungspfade oder Symlinks zu geben.Wahrscheinlich wäre das sauberste "firstboot" für Ubuntu, ein kleines Paket (.deb) zu erstellen, das ein Skript enthält, das abgelegt werden soll,
/etc/init.d/firstboot
und ein Post-Install-Skript, das verwendet wirdupdate-rc.d
, um es mit Runlevel 1 (/etc/rc1.d
) zu verknüpfen (mit einem Befehl wie :)update-rc.d firstboot defaults
. .. und dann die letzte Zeile deaktivieren oder löschen lassen mit etwas wie:update-rc.d firstboot disable
Hier ist ein Link zum Debian update-rc.d-HOWTO
quelle
Sie können das aktuelle rc.local in rc.local.bak sichern
Dann kannst du die Sachen, die du machen willst, in rc.local haben und am Ende nur noch mv /etc/rc.loca.bak /etc/rc.local.
quelle
Die Frage betraf das Ausführen eines Skripts beim ersten Start von EC2. Sie können
cloud-init
für diesen Zweck verwenden.Beim Starten einer neuen EC2-Instanz haben Sie die Möglichkeit,
User data
unter zu definierenAdvanced datails
. Wenn Sie dort eincloud-init
Skript platzieren, wird es nur beim ersten Start ausgeführt.Beispielsweise können Sie Folgendes einfügen in
User data
:Die Ausgabe wird in geschrieben
/var/log/cloud-init-output.log
Cloud-init
kann noch viel mehr. Es wurde speziell für die frühe Initialisierung von Cloud-Instanzen entwickelt. Siehe die Dokumente hier: http://cloudinit.readthedocs.io/en/latest/index.htmlquelle