Scripting durante a inicialização do Linux: como testar quando a inicialização está “completa”?

4

Eu tenho um script que é executado durante a inicialização em um servidor Debian. Está sendo executado muito cedo, mas não consigo controlar quando é disparado. Eu posso forçar o script a atrasar sua própria execução com:

sleep 60

... ou, alternativamente, eu poderia tentar a ação algumas vezes, assim:

TESTRUN=0
ACTIONWORKED=0
while [ $ACTIONWORKED -eq 0 ] && [ $TESTRUN -le 5 ]; do
      # run the action i want
      # quick test if it worked
      # if yes, set ACTIONWORKED=1
      # if no, sleep 10
      # increment TESTRUN
done

Qual é a melhor maneira de testar se o sistema está pronto? O script será executado em outros momentos durante a operação do sistema, portanto, o teste é necessário para diferenciar "boot-can" Estes estados " e " não-inicialização-execução-agora ". Eu não quero que ele espere toda vez que o script for executado.

Editar: Obrigado pelas ideias até agora. Mantenha-os próximos se você tiver alternativas para o que já foi postado.

Para aqueles que pediram detalhes, deixei-os fora da questão especificamente para reunir respostas que funcionam com o processo geral de inicialização do Linux.

Suponha que um sistema "totalmente inicializado" tenha apresentado um prompt de login (via console, X ou qualquer outro).

    
por quack quixote 05.11.2009 / 21:55

9 respostas

1

Realmente, a melhor maneira de fazer o que você quer é inserir uma chamada para o script no local apropriado no init do SysV. Eu recomendo que você escreva um script que chame seu script e persuada seu administrador de sistema até que ele ou ela o instale no lugar apropriado.

EDIT: Ok, acabei de ler sua outra pergunta, e vejo que você está falando sobre um script que é acionado de forma assíncrona, quando alguém se conecta a um dispositivo. O que você quer fazer é verificar o nível de execução para ver se ele é 2 (ou qualquer que seja o seu nível de execução padrão se você o alterou, e também 1 se quiser que isso seja executado no modo de usuário único). Debian FAQ corretamente, o nível de execução não muda para o padrão até que a inicialização seja concluída.

    
por 05.11.2009 / 22:08
5

Eu observaria os níveis de inicialização.

Isso deve começar ..

 [[ '/sbin/runlevel | cut -d " " -f 2' == 5 ]] && echo "Ready"

HTH

    
por 05.11.2009 / 22:12
2

Em um sistema debian, você pode especificar a ordem em que algo é executado durante a inicialização pelo número no início do script em /etc/rc?.d. Para que o primeiro script a ser executado nesse runlevel seja /etc/rc?.d/S01nome do script - e o último seria /etc/rc?.d/S99scriptname. Ao garantir que seu script seja o único que é prefixado com S99 , ele irá garantir que seja executado por último.

Como alternativa, uma das últimas coisas a fazer é chamar /etc/rc.local . Ao chamar seu script de lá, você pode garantir que ele seja chamado no final do processo de inicialização.

Outra opção seria testar o arquivo / etc / nologin - que é criado no início da inicialização e removido no final.

Dito isto - não creio que a sua ideia de testar se o script funcionou ou não é má. Isso garante que nada mais atrapalhe a execução correta do script.

    
por 05.11.2009 / 22:10
1

Você pode adicionar um script em rc3.d. Chame-o S99local e ele será executado depois de todos os outros scripts.

Os scripts são executados na ordem S01xx a S99xx.

    
por 05.11.2009 / 22:06
1

Você também pode executá-lo como um cronjob usando @reboot como a hora.

    
por 05.11.2009 / 22:09
1

Você está assumindo que precisa ver se o sistema está "pronto", mas o que isso significa? Qual funcionalidade você precisa para que esse script seja executado? A rede precisa estar funcionando? O X11 precisa ter um usuário conectado? Verifique essas condições diretamente ou encontre um local melhor para instalar o script que será executado quando essas etapas específicas forem concluídas (ou seja, uma sub-rotina de postup em / etc / network / interfaces ou similar).

    
por 05.11.2009 / 22:16
0

Duas informações ajudam muito a encontrar uma resposta:

  1. Por que você não pode ajustar quando o script é disparado?
  2. Quais serviços / recursos específicos precisam estar prontos / funcionando para que sua tarefa seja bem-sucedida? X networking? baixa carga do sistema? Arquivo compartilhado montado? Cada uma dessas coisas poderia ser verificada; "system is booted" é muito genérico e pode englobar qualquer um ou todos esses.
por 05.11.2009 / 22:17
0

O último arquivo que é chamado no processo de inicialização é um arquivo chamado /etc/rc.local. Tudo o que você colocar nesse arquivo será executado no final do processo de inicialização.

Um exemplo de manual para isso é link

    
por 06.11.2009 / 00:55
0

Aqui está uma solução ( verdadeiramente feia ):

  1. use este teste no script:

    while [ ! -e "/etc/yes-we-up" ]; do
        sleep 10
    done
    
  2. adicione isso ao final de /etc/rc.local :

    touch /etc/yes-we-up && chmod 644 /etc/yes-we-up
    
  3. crie /etc/init.d/is-we-up ,
     link simbólico para /etc/rc0.d/K02is-we-up e /etc/rc6.d/K02is-we-up ,
     e colocar isso nele:

    #!/bin/sh -e
    # no we ain't
    rm /etc/yes-we-up
    
por 06.11.2009 / 16:29