Script Bash para iniciar e depois desligar / reiniciar vários processos

7

Quando inicializo meu ambiente de desenvolvimento, há vários processos que preciso executar em segundo plano. É uma dor para iniciá-los individualmente, então eu quero escrever um script que inicie cada um. Eu posso fazer isso muito bem, mas o problema vem quando eu preciso reiniciá-los (algo que eu preciso fazer regularmente).

Qual é a maneira mais fácil de capturar o processo ao iniciá-lo e salvá-la para que, quando eu executar o script novamente, ele verifique se essa informação foi salva e feche esses processos antes de reiniciá-los. / p>

Eu também quero que o script seja flexível o suficiente para que, se eu desligar o processo manualmente, a) não jogue um erro se ele não encontrar o processo eb) não desligue acidentalmente algum outro processo que tenha em seguida, compartilhei qualquer informação de identificação que tenha armazenado.

Atualizar

Mais especificamente, quero pelo menos fazer o seguinte no momento:

1) Digite um comando curto como "start-dev"

2) Execute o seguinte (note que eu quero que o segundo e terceiro comandos sejam executados em segundo plano e estou usando & para fazer isso, mas não o comando final, pois quero ver a saída do passageiro durante a execução):

  1. Alterar para meu diretório de trabalho
  2. Iniciar o faye como um processo em segundo plano
  3. Iniciar o watchr como um processo em segundo plano
  4. Iniciar passageiro

Até agora eu tenho isso

#!/bin/bash
cd ~/path/to/my/working-directory
rackup faye.ru -s thin -E production &
watch refresh.watchr &
passenger start

Isso funciona bem, mas o problema surge quando eu preciso reiniciar todos esses processos. Eu primeiro tenho que rastrear todos os seus ids de processo e depois matá-los antes de executar o start-dev novamente. Por isso, gostaria de:

4) Digite um comando curto como "restart-dev", que rastreia os processos que eu executei anteriormente em segundo plano e depois os mato antes de executar o "start-dev" novamente. Ele precisa ser capaz de não lançar um erro se eu tiver desligado qualquer um deles manualmente e não tiver desligado acidentalmente um processo incorreto.

    
por Rupert Madden-Abbott 05.04.2011 / 16:07

2 respostas

7

Eu lidaria com algo assim.

#!/bin/bash  

startme() {
    cd ~/path/to/my/working-directory
    rackup faye.ru -s thin -E production &
    watch refresh.watchr &
    passenger start
}

stopme() {
    pkill -f "rackup faye.ru" 
    pkill -f "watch refresh.watchr"
}

case "$1" in 
    start)   startme ;;
    stop)    stopme ;;
    restart) stopme; startme ;;
    *) echo "usage: $0 start|stop|restart" >&2
       exit 1
       ;;
esac
    
por glenn jackman 05.04.2011 / 19:09
3

Eu diria que você provavelmente desejará escrever um script inicial para gerenciar esses processos. O Upstart é uma ferramenta perfeita para gerenciar daemons do sistema, mas também presta-se a qualquer tipo de processo em que você deseja controlar seu status.

Um script inicial acompanhará um processo, mas também permite que você faça scripts para que as coisas aconteçam antes de interrompê-lo.

stop on runlevel [06]
expect fork
respawn

script
    # run your process here
    # you might want to su to change user from root
end script

pre-stop script
    # things in here will run before the command is halted
end script

Salve isso como /etc/init/devenvironment.conf e, em seguida, você poderá controlá-lo com:

sudo start devenvironment
sudo stop devenvironment
sudo restart devenvironment
    
por Oli 05.04.2011 / 17:07

Tags