Existe uma maneira idiomática no Ubuntu para executar um script apenas na primeira vez em que uma máquina é inicializada? (EC2)
Existe uma maneira idiomática no Ubuntu para executar um script apenas na primeira vez em que uma máquina é inicializada? (EC2)
Respostas:
Não. Mas você pode colocar seu script /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
(esses scripts são executados a cada inicialização), os scripts são assim
#! / bin / bash FLAG = "/ var / log / firstboot.log" E se [ ! -f $ FLAG]; então #Coloque aqui suas frases de inicialização eco "Esta é a primeira inicialização" #the next line cria um arquivo vazio para não executar a próxima inicialização toque em $ FLAG outro eco "Não faça nada" fi
Estou surpreso com os resultados que estou procurando ao procurar um gancho de "primeira inicialização" do Ubuntu bem definido e suportado. Parece que o público da Red Hat / Fedora / CentOS tem esse problema há mais de uma década. O equivalente mais próximo do Ubuntu parece ser oem-config-firstboot .
A idéia de simplesmente executar um rm $0
irá funcionar. Mas, tecnicamente, existem algumas semânticas interessantes envolvidas. Diferentemente da maioria dos outros intérpretes de script no Unix, um script de shell é lido e processado uma linha / instrução de cada vez. Se você desvincular ( rm
) o arquivo dele, então a instância do shell que está processando esse script está agora trabalhando com um arquivo anônimo (qualquer arquivo que esteja aberto, mas não 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 vincular algo a algo assim tst
, a execução ./tst
deverá mostrar algo como isso na saída:
$ ./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, existem alguns casos de canto possíveis ímpares com relação a links simbólicos e casos em que o script foi chamado como um nome simples (forçando o shell a procurar $PATH
o script).
Mas parece que bash
(pelo menos na versão 3.2) precede $0
o caminho se ele pesquisou o caminho e deixa $ 0 definido como qualquer caminho relativo ou absoluto usado para invocar o script. Parece não fazer nenhum caminho relativo à normalização ou resolução, nem links simbólicos.
Provavelmente, o "firstboot" mais limpo para o Ubuntu seria criar um pequeno pacote (.deb) contendo um script a ser colocado /etc/init.d/firstboot
e um script de pós-instalação usado 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 faça com que a última linha execute uma desativação ou exclusão usando algo como:update-rc.d firstboot disable
Aqui está um link para o HOWTO Debian update-rc.d
A questão era sobre a execução de um script na primeira inicialização do EC2. Você pode usar cloud-init
para esse fim.
Ao iniciar uma nova instância do EC2, você tem uma opção para definir User data
em Advanced datails
. Se você colocar o cloud-init
script 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 do que isso. Ele foi projetado especialmente para executar a inicialização precoce de instâncias da nuvem. Consulte os documentos aqui: http://cloudinit.readthedocs.io/en/latest/index.html
$0
é específico do bash (versão> = 3). Para a finalidade da compatibilidade você pode fornecer nome do arquivo script em vez, tornando este menos genérica:rm /etc/init.d/script