Parando um script em execução através de outro arquivo de script

2

Eu sou novo em scripts de shell. Diga, eu começo um roteiro como este. Isso ocorre por 3 dias. Então, eu vou iniciar o script remotamente através do ssh e depois fechar o meu terminal local.

start.sh

end=$((SECONDS+259200))
x=1
while [ $SECONDS -lt $end ]
do
    #Some command
done

Como vou escrever um stop.sh para parar o script sempre que eu quiser pará-lo? Eu posso modificar start.sh , se necessário.

    
por Prasanna 22.09.2014 / 01:40

1 resposta

6

Algumas maneiras:

Mate qualquer instância do script:

pkill -f start.sh

Isso eliminará qualquer processo com start.sh em sua linha de comando, usando pkill .

Mate uma instância específica do script:

Modifique o script para salvar seu PID em algum lugar:

#! /bin/bash
echo $$ >> /tmp/start_sh.pid
end=...

E diga stop.sh para matar o processo com o PID:

#! /bin/bash
kill $(cat /tmp/start_sh.pid) || echo "Process is not running."

Isso eliminará todos os script.sh processos.

Comunique-se com start.sh

Diga start.sh para ler algum arquivo dizendo para sair:

#! /bin/bash
...
while [ $SECONDS -lt $end ]
do
    [[ $(cat ~/kill_start.txt) == "KILL" ]] && exit 1
    ...

E diga stop.sh para escrever "KILL" para esse arquivo:

#! /bin/bash   
echo "KILL" > ~/kill_start.sh

Isso eliminará todas as instâncias de start.sh , quando a próxima iteração de cada script for executada.

(Apesar do nome kill_start.sh não é um script.)

Use pipes nomeados para se comunicar

Como alternativa, você pode executar um trabalho em segundo plano no script para observar alterações em ~/kill_start.sh :

#! /bin/bash
...
[[ -p ~/kill_script.sh ]] && mkfifo ~/kill_script.sh
(read -N 0 < ~/kill_script && [[ $REPLY == "KILL" ]] && kill 0) &

while [ $SECONDS -lt $end ]
do
    ...

Em stop.sh , ecoe qualquer coisa para ~/kill_script :

#! /bin/bash
echo anything at all

Isso usará mkfifo para criar um pipe nomeado . Em seguida, read tentará ler a partir desse canal e esperará até receber qualquer entrada. Em seguida, vá para exit . Isso deve entrar em vigor quase imediatamente.

Use screen

Com screen , você pode iniciar um shell via SSH, fechar sua conexão e depois retomar mais tarde. Então você pode iniciar uma sessão de screen para o script, fechar sua conexão, ir de férias, voltar, lembrar sua conexão de tela e matar o script usando Ctrl C .

    
por muru 22.09.2014 / 01:44