Comecei um loop em uma sessão for
interativa . bash
Para esta questão, podemos assumir que o loop era algo como
for i in dir/*; do
program "$i"
done > log
O comando demora muito mais do que o esperado e ainda é executado. Como posso ver o progresso atual do for
loop em execução.
Não Soluções:
- Olhe
log
.
Não funciona porque:program
espera-se que seja executado silenciosamente. Você pode pensarprogram
como um validador. Se o loop for concluído sem nenhuma saída, estou feliz. - Pare o laço. Adicione algum tipo de indicação de progresso (por exemplo
echo "$i"
). Inicie o loop novamente.
Não funciona porque: O loop já funcionou por horas. Eu não quero jogar fora todo o tempo e energia investidos na corrida atual. Presumo que tudo funcione bem. Estou apenas curioso e quero saber o progresso atual. - Ctrl+ Zthen
set -x; fg
Não funciona porque:bash
não continua o loop ao usarfg
. Depoisfg
que apenas o comando atual/próximo dentro do loop for executado, o loop será encerrado. Você pode tentar você mesmo usandofor i in {1..200}; do printf '%s ' $i; /usr/bin/sleep 0.5; done
.
Os curingas como
dir/*
sempre se expandem na mesma ordem. Este recurso junto com o valor atual de$i
pode ser usado para mostrar uma informação de progresso.O valor atual de
$i
pode ser recuperado observando os processos em execução em seu sistema. O comando a seguir imprime a instância atualmente em execuçãoprogram
e seus argumentos.Se houver vários
program
processos, você pode usar a--parent ...
opção parapgrep
corresponder apenas aos processos iniciados pelo shell executando ofor
loop que deseja inspecionar.Extraia o valor de
$i
manualmente e obtenha seu progresso usandoIsso funciona sob duas suposições
O conteúdo de
dir/
não muda durante a execução do loop. Seprogram
cria, renomeia ou exclui arquivos, os números provavelmente estão errados.A chamada
program
inicia um novo processo. Seprogram
for umabash
função, não haverá um subprocesso paraprogram
. Se afunction
própria função chamar outro programa que inicia um novo processo, você poderá procurar esse subprograma. No entanto, seprogram
for um bash interno (comandos listados porhelp
) ou uma função bash pura (uma que usa apenasbash
internos), você está sem sorte.Se você tiver o problema 2 ou seu
for
loop tiver uma estrutura diferente da da pergunta (por exemplo,program < "$1"
ou um corpo de loop muito longo com muitos programas diferentes), você poderá obter algumas informações de progressolsof
observando os arquivos abertos por sua sessão de shell atual ou seus processos filhos.