Existe uma maneira idiomática no Ubuntu para executar um script apenas na primeira vez em que uma máquina é inicializada? (EC2)
boot
scripts
amazon-ec2
Roberto Aloi
fonte
fonte
$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
Crie um arquivo de rastreamento quando o script for executado. Se o arquivo já existir, saia do script.
fonte
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 assimfonte
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:
Se você salvar isso em algo como
rmself.sh
e vincular algo a algo assimtst
, a execução./tst
deverá mostrar algo como isso na saída: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 usadoupdate-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
fonte
Você pode fazer backup do rc.local atual em rc.local.bak
Depois, você pode ter o que deseja fazer no rc.local e, no final, apenas mv /etc/rc.loca.bak /etc/rc.local.
fonte
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
emAdvanced datails
. Se você colocar ocloud-init
script lá, ele será executado apenas na primeira inicialização.Por exemplo, você pode colocar o seguinte em
User data
: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.htmlfonte