Execute um script apenas na primeira inicialização

12

Existe uma maneira idiomática no Ubuntu para executar um script apenas na primeira vez que uma máquina é inicializada? (EC2).

    
por Roberto Aloi 27.06.2012 / 17:58

6 respostas

14

Não. Mas você pode querer colocar seu script em /etc/init.d/script e excluí-lo automaticamente:

#!/bin/bash

echo "Bump! I'm your first-boot script."

# Delete me
rm $0
    
por Andrejs Cainikovs 27.06.2012 / 18:06
7

Crie um arquivo de rastreamento quando o script for executado. Se o arquivo já existir, saia do script.

    
por Tom 27.06.2012 / 18:10
7

Combinando as duas primeiras respostas Supondo que você nomeie seu script /usr/local/bin/firstboot.sh coloque-o no final de /etc/rc.local (este script é executado em cada inicialização) os scripts são assim

#!/bin/bash

FLAG="/var/log/firstboot.log"
if [ ! -f $FLAG ]; then
   #Put here your initialization sentences
   echo "This is the first boot"

   #the next line creates an empty file so it won't run the next boot
   touch $FLAG
else
   echo "Do nothing"
fi
    
por Awi 28.06.2012 / 01:33
2

Estou surpreso com os resultados que estou procurando por um gancho "primeiro boot" do Ubuntu bem definido e suportado. Parece que o pessoal da Red Hat / Fedora / CentOS tem esse problema há mais de uma década. O equivalente Ubuntu mais próximo parece ser oem-config-firstboot .

A ideia de simplesmente executar um rm $0 funcionará. Mas, tecnicamente, há alguma semântica interessante envolvida. Ao contrário da maioria dos outros interpretadores de script no Unix, um script de shell é lido e processado em uma linha / instrução por vez. Se você desvincular ( rm ) o arquivo de dentro dele, então a instância do shell que está processando esse script agora está trabalhando com um arquivo anônimo (qualquer arquivo que esteja aberto, mas desvinculado).

Considere um arquivo 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

Se você salvar isso em algo como rmself.sh e (hard) vincular isso a algo como tst , então executar ./tst deverá mostrar algo como isso:

$ ./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

Agora, há alguns casos esquisitos possíveis em relação a links simbólicos e casos em que o script foi invocado como um nome simples (forçando o shell a pesquisar o $PATH do script.

Mas parece que bash (pelo menos na versão 3.2) preenche $0 com o caminho se ele pesquisou o caminho e, caso contrário, deixa $ 0 definido como qualquer caminho relativo ou absoluto usado para invocar o script. Não parece fazer qualquer normalização ou resolução de caminhos relativos nem links simbólicos.

Provavelmente, o "firstboot" mais limpo para o Ubuntu seria criar um pacote pequeno (.deb) contendo um script a ser colocado em /etc/init.d/firstboot e um script de pós-instalação que usa update-rc.d para vinculá-lo ao nível de execução 1 ( /etc/rc1.d ) (usando um comando como: update-rc.d firstboot defaults ) ... e depois a última linha executa uma desativação ou exclusão usando algo como: update-rc.d firstboot disable

Aqui está um link para o Debian update-rc.d HOWTO

    
por Jim Dennis 24.02.2015 / 23:10
0

Você pode fazer backup do rc.local atual para rc.local.bak

Então você pode ter as coisas que você quer fazer em rc.local e no final apenas mv /etc/rc.loca.bak /etc/rc.local.

    
por lmojzis 27.02.2017 / 04:52
0

A questão era sobre a execução de um script na primeira inicialização do EC2. Você pode usar cloud-init para essa finalidade.

Ao lançar uma nova instância do EC2, você tem a opção de definir User data em Advanced datails . Se você colocar o script cloud-init lá, ele será executado apenas na primeira inicialização.

Por exemplo, você pode colocar o seguinte em User data :

#cloud-config

runcmd:
  - /usr/bin/command1.sh
  - /usr/bin/command2.sh

A saída será gravada em /var/log/cloud-init-output.log

Cloud-init pode fazer muito mais que isso. Ele foi projetado especialmente para executar a inicialização antecipada de instâncias da nuvem. Veja os documentos aqui: link

    
por Dima L. 26.04.2018 / 18:18