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
Existe uma maneira idiomática no Ubuntu para executar um script apenas na primeira vez que uma máquina é inicializada? (EC2).
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
Crie um arquivo de rastreamento quando o script for executado. Se o arquivo já existir, saia do script.
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
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
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.
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
Tags boot scripts amazon-ec2