¿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

$0es 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/scriptCree 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.shponlo 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 $0testamento 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.shy lo vincula (de forma rígida) a algo asítst, la ejecución./tstdeberí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
$PATHel script.Pero parece que
bash(al menos en la versión 3.2) antepone$0la 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/firstbooty un script posterior a la instalación que se usaupdate-rc.dpara 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 disableAquí 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-initpara este propósito.Al iniciar una nueva instancia de EC2, tiene una opción para definir
User dataenAdvanced datails. Si coloca elcloud-initscript 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.logCloud-initpuede 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