Costumo usar scripts de shell bash
para executar comandos simples para muitos arquivos diferentes. Por exemplo, suponha que eu tenha o seguinte script shell bash
, chamado script.sh
, que executa o programa / comando 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 demorará muito tempo (horas ou dias, por exemplo). Por causa disso, eu 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 desligamento, mas agora suponha que eu gostaria de finalizar a execução em algum momento por algum motivo. Como posso fazer isso?
O problema que eu encontrei é que, olhando para top
, vejo apenas o foo
correspondente a "a.txt"
. Eu posso terminar essa chamada de foo
, mas então o foo
correspondente a "b.txt"
é chamado e então eu tenho que finalizar esse também, e assim por diante. Para dezenas ou centenas de arquivos de texto especificados no loop for
, torna-se difícil terminar cada foo
, um por um! Então, de alguma forma, eu preciso terminar o script de shell em si , não as chamadas particulares emitidas pelo script de shell.
Quando eu digito o comando
ps -u myusername
onde myusername
é meu nome de usuário, recebo uma lista de processos que estou executando. Mas vejo dois IDs de processo diferentes chamados bash
. Como sei qual desses processos, se houver, corresponde à minha chamada original nohup bash script.sh &
?