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" naps
saída, mas as respostas aqui são mais úteis.Respostas:
Por padrão,
ps
não mostrará os parâmetros com os quais o programa foi chamado. As opções-f
e-l
ambas mostrarão a chamada completa.resultará em uma saída parecida com:
fonte
Você tem algumas opções. Como seu processo está sendo executado em segundo plano, você pode usá
jobs
-lo para encontrá-lo:Você também pode usar
pkill
para procurar na tabela de processos uma correspondência de linha de comando; viz:fonte
A
ps
saída (com, por exemplops aux
) inclui o ID do processo do pai. Mate o paibash
e seus filhos também serão extintos.Para uma visualização ASCII da árvore de processos, tente
pstree -p
executar alguns processos em segundo plano.fonte