Existe uma maneira de fazer jobs -p
no zsh se comportar como no bash, ou seja. dê
apenas um número, tal que se possa fazer kill $(jobs -p)
?
relate perguntas
-
Listar arquivos que não possuem outro arquivo com sufixo
-
Em que circunstâncias o executável encontrado primeiro no caminho não será usado
-
Symlinking para todos os arquivos de ponto e diretórios
-
Como incrementar uma variável nomeada dinamicamente em `zsh`
-
Por que não consigo definir uma variável somente leitura chamada path no zsh?
jobs
relatórios sobre jobs, que podem ter mais de um processo.Quando interativas, as tarefas são colocadas em grupos de processos, para que possam ser suspensas/reiniciadas/interrompidas como um todo.
jobs -p
(em amboszsh
ebash
) retorna o ID do grupo de processos de cada trabalho, não os IDs de processo de todos os processos no trabalho.Quando o shell não é executado interativamente (onde não há controle de tarefas), o shell informa o pid do processo que seria o líder do grupo de processos se houvesse controle de tarefas (que pode não ser o mesmo retornado em
$!
a propósito).O zsh relata que para o job 2 do pgid 29643, o zsh iniciou 2 processos, um dos quais já está concluído e o outro ainda em execução.
Se você deseja obter os pgids apenas como em
bash
, você pode canalizar isso:Se você deseja obter os pids no trabalho (somente aqueles iniciados pelo shell), você pode olhar para o
$jobstates
array associativo especial:Para extrair os pids dos processos ainda em execução no job 1:
Agora, se você deseja matar esses trabalhos, você deseja matar os grupos de processos (em shells interativos), ou seja, todos os trabalhos, não um processo aleatório no trabalho.
Você pode matar o grupo de processos de id 29643 com
kill -- -29643
,kill 29643
apenas mataria o processo de id 29643 (que já está morto em nosso exemplo acima).Aqui, faria mais sentido passar números de tarefas em vez de pid ou pgid (que não funcionaria em shells não interativos) para matar. É para isso que servem os números de trabalho:
Infelizmente, não acho que
bash
tenha um equivalente confiável.É difícil extrair os números de trabalho de forma confiável a partir disso. (Também acho que nem
while kill %; do continue; done
funciona por causa do que parece ser algum bug de condição de corrida).Observe que, quando não estiver sendo executado interativamente, não há controle de trabalho, portanto, quando você faz
kill %1
para matar o trabalho número 1, esse trabalho não possui um grupo de processos. Então, como uma aproximação de um homem pobre, o shell (ambosbash
ezsh
) matará cada processo que conhece individualmente. Em nosso exemplo acima, em vez de:vai fazer:
Ele não matará os outros processos (se houver) que esses 2 processos geraram, embora ainda seja melhor do que matar apenas 29643 como em sua
kill $(jobs -p)
abordagem.