Costumo usar bash
scripts de shell para executar comandos simples para muitos arquivos diferentes. Por exemplo, suponha que eu tenho o seguinte bash
shell script, chamada script.sh
, que executa o comando / programa foo
em três arquivos de texto "a.txt"
, "b.txt"
, "c.txt"
:
#!/bin/bash
for strname in "a" "b" "c"
do
foo $strname".txt"
done
Além disso, suponha que foo $strname".txt"
seja lento, portanto a execução do script levará muito tempo (horas ou dias, por exemplo). Por isso, gostaria de usar nohup
para que a execução continue mesmo se o terminal estiver fechado ou desconectado. Eu também gostaria que o script fosse imediatamente para o segundo plano, então usarei o &
operador. Assim, usarei o seguinte comando para chamar script.sh
:
nohup bash script.sh &
Isso funciona bem para executar o script em segundo plano e sem interrupções, mas agora suponha que eu gostaria de encerrar a execução em algum momento por algum motivo. Como posso fazer isso?
O problema que encontrei é que, olhando top
, vejo apenas o foo
correspondente a "a.txt"
. Posso encerrar a foo
chamada, mas o foo
correspondente a "b.txt"
é chamado e, em seguida, tenho que encerrar a chamada, e assim por diante. Para dezenas ou centenas de arquivos de texto especificados no for
loop, torna-se difícil encerrar todos foo
, um por um! Então, de alguma forma, eu preciso finalizar o próprio script de shell , não as chamadas específicas emitidas a partir do script de shell.
Quando digito o comando
ps -u myusername
Onde myusername
está meu nome de usuário, recebo uma lista dos processos que estou executando. Mas vejo duas identificações de processo diferentes chamadas bash
. Como sei qual desses processos, se houver, corresponde à minha chamada original nohup bash script.sh &
?
for s in a b c; do foo "$s".txt; done
nohup
já estará longe quando você abrir uma lista de processos para ver o trabalho iniciado. Você pode olhar para a coluna "gentileza" na ps
saída, mas as respostas aqui são mais úteis.