Como iniciar dois processos em segundo plano e trazer o segundo trabalho para o forground?

0

Estes dois processos:

cat /dev/tty > /dev/null &
cat /dev/zero > /dev/null &

tem que ser executado em segundo plano, mas estou tendo problemas para trazer o segundo trabalho para o primeiro plano.

    
por JEllis23 06.11.2016 / 04:28

3 respostas

0

Já experimentou o comando fg ?

fg %2

    
por 06.11.2016 / 04:36
0

Enquanto $! contém o ID do processo do mais alto processo do último trabalho iniciado em segundo plano, é surpreendentemente difícil obter seu ID trabalho em um maneira infalível.

Não é necessariamente o maior ID de trabalho, pois os IDs de trabalho são reutilizados. Não é necessariamente o trabalho a que você pode referir-se por %% ou %+ (ou que fg sem argumento agiria), pois os trabalhos suspensos têm precedência (como no seu caso em que o primeiro trabalho provavelmente será suspenso, pois tentará ler a partir do tty enquanto não estiver em primeiro plano) ou o trabalho iniciado mais recentemente pode ter morrido já (nesse caso, %+ se referiria ao próximo trabalho na lista).

Então, você precisa executar jobs primeiro para saber qual é o número do trabalho para o trabalho que você deseja fg (use% usefg %thatnumber) ou se não há outro trabalho com zero em seu trabalho. nome, execute:

fg %\?zero

Com zsh , você pode usar:

fg_most_recent() {
  local job=${(k)jobstates[(R)*:$!=*]}
  ((job)) && fg %$job
}

Ou seja, obtenha a k ey da matriz associativa $jobstates cujo valor corresponde ao padrão *:$!=* ( $jobstates se parece com running:+:20162=running:20163=running fornecendo o status de todos os processos na tarefa que zsh começou diretamente).

    
por 21.09.2017 / 12:47
0

Se isso fosse dois trabalhos comuns, então um fg simples colocaria o segundo trabalho em primeiro plano se esse fosse o trabalho em segundo plano suspenso mais recentemente ou os trabalhos em segundo plano iniciados mais recentemente (sem nenhum outro trabalho suspenso).

No entanto, pela natureza do primeiro trabalho (leitura de /dev/tty ), ele será interrompido assim que tentar ler o TTY. fg colocará novamente em primeiro plano.

A solução aqui é usar %- ou %2 , já que não há outros trabalhos.

Quando um trabalho é colocado em segundo plano, seja iniciando o trabalho com um & à direita ou suspendendo um trabalho em primeiro plano com Ctrl + Z e, em seguida, fornecendo o comando bg , o trabalho recebe um "ID de trabalho" ou "especificação de trabalho". Esse ID de trabalho é geralmente denotado por %N , em que N é um número decimal.

Você pode usar o ID do trabalho com vários comandos, como wait , kill , fg e bg . O comando kill , por exemplo, pode ser usado para enviar um sinal para um trabalho em segundo plano usando seu ID de trabalho.

O comando fg , por padrão, funciona no "trabalho atual". O ID do trabalho atual está disponível como %+ ou %% . O trabalho atual é o trabalho em segundo plano iniciado mais recentemente ou, se houver trabalhos suspensos, o último trabalho suspenso.

Para mover um trabalho de segundo plano arbitrário para o primeiro plano, use seu ID de trabalho:

$ sleep 1000 &
[1] 37327
$ sleep 500 &
[2] 83532
$ jobs
[1]-  Running                 sleep 1000 &
[2]+  Running                 sleep 500 &
$ fg %1
sleep 1000

O + na saída de jobs denota o "trabalho atual" (que é o que seria alternado com uma simples invocação de fg ).

IDs de trabalho especial padrão POSIX:

  • %% , o trabalho atual.
  • %+ , o mesmo que acima.
  • %- , o trabalho anterior.
  • %N , número do trabalho N .
  • %string , a tarefa cujo comando começa com string .
  • %?string , o job cujo comando contém string .
por 21.09.2017 / 11:53