¿Hay alguna forma idiomática en Ubuntu para ejecutar un script solo la primera vez que se inicia una máquina? (EC2).
¿Hay alguna forma idiomática en Ubuntu para ejecutar un script solo la primera vez que se inicia una máquina? (EC2).
Respuestas:
No. Pero es posible que desee colocar su script /etc/init.d/script
y eliminarlo automáticamente:
#!/bin/bash
echo "Bump! I'm your first-boot script."
# Delete me
rm $0
Cree un archivo de seguimiento cuando se ejecute el script. Si el archivo ya existe, salga del script.
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í
#! / bin / bash FLAG = "/ var / log / firstboot.log" Si [ ! -f $ BANDERA]; luego #Ponga aquí sus oraciones de inicialización echo "Esta es la primera bota" # la siguiente línea crea un archivo vacío para que no se ejecute el próximo arranque toque $ BANDERA más echo "No hacer nada" fi
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:
#!/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
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:
$ ./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
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 usa update-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
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
en Advanced datails
. Si coloca el cloud-init
script allí, se ejecutará solo en el primer arranque.
Por ejemplo, puede colocar lo siguiente en User data
:
#cloud-config
runcmd:
- /usr/bin/command1.sh
- /usr/bin/command2.sh
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.html
$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