É possível adicionar um processo à lista de empregos no bash (por exemplo, para reverter a opção "negar")?

7

Se eu disown um trabalho em bash e mudar de idéia, posso desfazer isso de alguma forma?

Se assim for, levando-se adiante, é possível colocar um processo arbitrário sob controle de trabalho (uma restrição aceitável seria que eu possuísse o processo)?

E, finalmente, isso tornaria possível o fluxo de trabalho abaixo:

  • colocar trabalho em segundo plano ( ^z seguido por bg )
  • obtenha seu pid ( jobs -p %+ para obter seu <pid> )
  • abra uma sessão screen ou tmux , anexe-a e use-a para as etapas a seguir
  • use reptyr para pegar o trabalho ( reptyr <pid> )
  • adicione <pid> ao controle de tarefa do shell ( isso é possível? )
  • interrompe o trabalho ( ^Z )

Eu posso fazer tudo, exceto as duas últimas etapas. Parar o trabalho com ^Z não funciona porque o processo não está na lista de trabalhos do shell.

Minha pesquisa indica que não é possível possuir (reverso de disown ) um pid, mas espero estar errado ...

    
por starfry 13.07.2015 / 11:47

1 resposta

3

Em geral, não é possível que um shell “adote” um trabalho. Para um shell, um trabalho significa algumas coisas:

  • Associe um identificador de trabalho a um ID de processo.
  • Exibe seu status (em execução, suspenso, morto).
  • Notifique o usuário quando o status mudar.
  • Envie um sinal SIGHUP quando o terminal desaparecer.
  • Controle se o trabalho “possui” o terminal (seja o grupo de processos de primeiro plano).

A maioria deles não requer nenhuma associação especial entre o shell e o trabalho, mas há alguns que fazem isso:

  • Para notificar o usuário quando o status é alterado, o shell se baseia no recebimento de um sinal SIGCLD . Este sinal é enviado pelo kernel para o processo pai do processo inicial da tarefa.
  • Para controlar o acesso ao terminal, o shell precisa estar na mesma sessão que o trabalho.

Não é possível que um processo adote outro processo nem associe um processo a uma sessão existente. Então, para suportar a adoção, o shell teria que gerenciar um status parcial. Os shells usuais não implementaram isso.

No caso especial em que o job é inicialmente iniciado por esse shell e depois desfeito, esses problemas não surgem. Mas nenhum dos shells usuais implementou uma exceção à exceção que permite que eles adicionem um job se inicialmente o tivessem iniciado.

Em seu cenário, normalmente seria mais conveniente iniciar o trabalho em uma sessão de tela ou tmux e usar o PID se você quiser suspendê-lo ou reiniciá-lo.

    
por 14.07.2015 / 21:22