Existe-t-il un moyen idiomatique dans Ubuntu d'exécuter un script uniquement la première fois qu'une machine est démarrée? (EC2).
boot
scripts
amazon-ec2
Roberto Aloi
la source
la source
$0
est spécifique à bash (version> = 3). À des fins de compatibilité, vous pouvez fournir un nom de fichier de script à la place, ce qui le rend moins générique:rm /etc/init.d/script
Créez un fichier de suivi lors de l'exécution du script. Si le fichier existe déjà, quittez le script.
la source
Combiner les deux premières réponses En supposant que vous nommez votre script,
/usr/local/bin/firstboot.sh
placez-le à la fin de/etc/rc.local
(ces scripts s'exécutent à chaque démarrage) les scripts vont comme cecila source
Je suis surpris des résultats que je constate pour la recherche d'un crochet de "premier démarrage" Ubuntu bien défini et pris en charge. On dirait que la foule Red Hat / Fedora / CentOS a ce problème depuis plus d'une décennie. L'équivalent Ubuntu le plus proche semble être oem-config-firstboot .
L'idée de simplement exécuter un
rm $0
testament fonctionnera. Mais techniquement, il y a des sémantiques intéressantes. Contrairement à la plupart des autres interpréteurs de scripts sous Unix, un script shell est lu et traité une ligne / instruction à la fois. Si vous dissociez (rm
) le fichier par-dessous, alors que l'instance du shell qui traite ce script fonctionne maintenant avec un fichier anonyme (tout fichier ouvert mais non lié).Considérez un fichier comme celui-ci:
Si vous enregistrez cela dans quelque chose comme
rmself.sh
et liez (dur) cela à quelque chose comme ça, l'tst
exécution./tst
devrait afficher quelque chose comme ceci en sortie:Il y a maintenant quelques cas de coin étranges possibles en ce qui concerne les liens symboliques et les cas où le script a été invoqué en tant que nom nu (forçant le shell à rechercher
$PATH
le script.Mais il semble que
bash
(au moins dans la version 3.2) précède$0
le chemin s'il a recherché le chemin et laisse autrement $ 0 défini sur le chemin relatif ou absolu utilisé pour appeler le script. Il ne semble pas faire de chemins relatifs de normalisation ou de résolution ni de liens symboliques.Le "premier démarrage" le plus propre pour Ubuntu serait probablement de créer un petit package (.deb) contenant un script à placer
/etc/init.d/firstboot
et un script de post-installation qui l'utiliseupdate-rc.d
pour le lier au niveau d'exécution 1 (/etc/rc1.d
) (en utilisant une commande comme:)update-rc.d firstboot defaults
. .. puis demandez à la dernière ligne de désactiver ou de supprimer en utilisant quelque chose comme:update-rc.d firstboot disable
Voici un lien vers le HOWTO Debian update-rc.d
la source
Vous pouvez sauvegarder rc.local actuel sur rc.local.bak
Ensuite, vous pouvez avoir ce que vous voulez faire dans rc.local et à la fin juste mv /etc/rc.loca.bak /etc/rc.local.
la source
La question portait sur l'exécution d'un script au premier démarrage d'EC2. Vous pouvez utiliser
cloud-init
à cette fin.Lors du lancement d'une nouvelle instance EC2, vous avez la possibilité de définir
User data
sousAdvanced datails
. Si vous y placez uncloud-init
script, il sera exécuté au premier démarrage uniquement.Par exemple, vous pouvez placer les éléments suivants dans
User data
:La sortie sera écrite dans
/var/log/cloud-init-output.log
Cloud-init
peut faire bien plus que cela. Il est spécialement conçu pour effectuer une initialisation précoce des instances cloud. Voir les documents ici: http://cloudinit.readthedocs.io/en/latest/index.htmlla source