¿Hay alguna forma idiomática en Ubuntu para ejecutar un script solo la primera vez que se inicia una máquina? (EC2).
boot
scripts
amazon-ec2
Roberto Aloi
fuente
fuente
$0
es específico de bash (versión> = 3). Para fines de compatibilidad, puede proporcionar el nombre del archivo de script en su lugar, lo que lo hace menos genérico:rm /etc/init.d/script
Cree un archivo de seguimiento cuando se ejecute el script. Si el archivo ya existe, salga del script.
fuente
Combinando las dos primeras respuestas Asumiendo que nombras tu script
/usr/local/bin/firstboot.sh
ponlo al final de/etc/rc.local
(este script se ejecuta en cada arranque) los scripts son asífuente
Estoy sorprendido por los resultados que estoy viendo para buscar un gancho de "primer arranque" de Ubuntu bien definido y compatible. Parece que la multitud de Red Hat / Fedora / CentOS ha tenido esto clavado por más de una década. El equivalente más cercano de Ubuntu parece ser oem-config-firstboot .
La idea de simplemente realizar un
rm $0
testamento funcionará. Pero, técnicamente, hay algunas semánticas interesantes involucradas. A diferencia de la mayoría de los otros intérpretes de script en Unix, un script de shell se lee y procesa una línea / declaración a la vez. Si desvincula (rm
) el archivo de debajo, entonces la instancia del shell que procesa ese script ahora está trabajando con un archivo anónimo (cualquier archivo que esté abierto pero no vinculado).Considere un archivo como este:
Si guarda eso en algo como
rmself.sh
y lo vincula (de forma rígida) a algo asítst
, la ejecución./tst
debería mostrar algo como esto como salida:Ahora hay algunos casos de esquina posibles con respecto a los enlaces simbólicos y casos en los que se invocó el script como un nombre simple (lo que obliga al shell a buscar
$PATH
el script.Pero parece que
bash
(al menos en la versión 3.2) antepone$0
la ruta si buscó la ruta y de lo contrario deja $ 0 establecido en la ruta relativa o absoluta que se utilizó para invocar el script. No parece hacer ninguna ruta relativa de normalización o resolución ni enlaces simbólicos.Probablemente, el "primer arranque" más limpio para Ubuntu sería crear un pequeño paquete (.deb) que contenga un script para colocarlo
/etc/init.d/firstboot
y un script posterior a la instalación que se usaupdate-rc.d
para vincular eso en el nivel de ejecución 1 (/etc/rc1.d
) (usando un comando como:)update-rc.d firstboot defaults
. .. y luego haga que la última línea realice una desactivación o eliminación usando algo como:update-rc.d firstboot disable
Aquí hay un enlace al COMO de Debian update-rc.d
fuente
Puede hacer una copia de seguridad de rc.local actual en rc.local.bak
Entonces puede tener las cosas que desea hacer en rc.local y al final solo mv /etc/rc.loca.bak /etc/rc.local.
fuente
La pregunta era sobre ejecutar un script en el primer arranque de EC2. Puedes usar
cloud-init
para este propósito.Al iniciar una nueva instancia de EC2, tiene una opción para definir
User data
enAdvanced datails
. Si coloca elcloud-init
script allí, se ejecutará solo en el primer arranque.Por ejemplo, puede colocar lo siguiente en
User data
:La salida se escribirá en
/var/log/cloud-init-output.log
Cloud-init
puede hacer mucho más que esto. Está diseñado especialmente para realizar una inicialización temprana de instancias en la nube. Vea los documentos aquí: http://cloudinit.readthedocs.io/en/latest/index.htmlfuente