Bash / ZSH: Desfazendo 'disown'

30

Existe uma maneira de "reconectar" um processo à tabela de tarefas de shells depois que ela foi "rejeitada"?

Edit: $ SEARCHENGINE totalmente me falha. Não parece muito bom.

nisc
fonte

Respostas:

16

Considerando como os trabalhos linux e a propriedade do processo funcionam, receio que não seja realmente possível readquirir um processo, sem a ajuda do processo de adoção.

Um pai ou mãe pode 'renegar' um filho, que é 'adotado' pelo processo chamado 'init'. A segurança do sistema impede que alguém pegue os processos de outra pessoa. Quando você o nega, um processo se torna de outra pessoa (init) para controlar. Você como 'usuário' ainda pode matar o processo, mas não pode recuperá-lo. É improvável que tentar coagir o init a retornar seu processo, pois o init nem mesmo lê e-mails.

Por mais cruel que pareça, tudo se resume à resposta de "Não faça isso!".

lornix
fonte
1
Isso não pode estar certo: o processo pai não pode fazer com que o filho seja adotado, exceto ao sair. O comportamento que você descreve deve ser acionado a partir do processo filho (ou pelo kernel, que faz parte disso automaticamente se o pai morre). Um processo não pode adotar uma criança voluntariamente, mas também não pode desistir de uma.
Gilles 'SO- stop be evil'
1
Me desculpe. Minha culpa. Muito simplificado demais. Percorreu a fonte do bash novamente, o bash ainda mantém a propriedade, mas inibe o suspiro que está sendo passado para o processo filho. Portanto, pode ser possível recuperá-lo, mas ainda não está incorporado no bash. Por alguma razão, fiquei preso na colheita de órfãos e zumbis pelo init.
Lornix 29/10/10
@ Lomix sim, mas quando você sai do shell que o deserdou, ele recebe um ppid de 1. para que seu raciocínio seja válido. que rejeita a menos que esteja prestes a sair de qualquer maneira: p
Orwellophile 15/12/13
1
Desculpe, mas esta resposta está errada. Basta usar reptyr(veja minha resposta para um exemplo de uso).
Christian Pietsch
18

Embora eu assuma que isso não ajude ninguém na situação infeliz de ter repudiado o processo errado, se você banir o repúdio do seu fluxo de trabalho e substituí-lo por:

https://github.com/nelhage/reptyr

Você seria capaz de reparar qualquer processo (ou seja, movê-lo para dentro da tela).

Thom
fonte
2
Bem, eu recuperei meu processo de vim renegado com reptyr, então funcionou exatamente como o utilitário não renegado que eu estava procurando.
hlovdal
Você está certo, @hlovdal: Esta resposta está meio errada. reptyré a solução, mas não há necessidade de parar de usar disown. Para maior clareza, escrevi uma nova resposta.
Christian Pietsch
11

Tudo que você precisa é reptyr. Ele mora no GitHub e foi empacotado para o Debian desde o Wheezy, e provavelmente para outras distribuições do GNU / Linux também. Ele colocará em primeiro plano seu processo renegado no terminal atual se você o chamar com seu ID do processo (PID). Então, por exemplo:

pgrep -f DISOWNED_PROCESS  # to find out the PID of the disowned process
reptyr PID                 # insert this PID here
Christian Pietsch
fonte
2
(sudo apt-get install reptyr) Em seguida, tente isso na primeira tentativa: "O kernel negou permissão ao anexar. Se o seu uid corresponder ao destino, verifique o valor de / proc / sys / kernel / yama / ptrace_scope. Para obter mais informações, consulte /etc/sysctl.d/10-ptrace.conf "Alterei o valor nos dois locais de 1 para 0 e funcionou. Eu testei um repúdio e reptyr de um processo como o mesmo usuário (ipython notebook no ubuntu 14.04 LTS). Talvez isso seja bom para o desenvolvimento em um ambiente isolado ... entretanto, não tenho certeza das implicações finais de segurança da mudança. Talvez alguém com experiência possa
entrar
1

Desculpe, não. Em princípio, seria possível, uma vez que a renúncia apenas altera algum estado interno do shell - basicamente remove o ID do processo de uma lista e pode ser adiado sem muito trabalho (você teria que ter um pouco de cuidado ao testar isso o pid reconectado está na sessão correta, mas isso não é intransponível). Mas nenhuma das conchas usuais (bash, ksh, tcsh, zsh) parece ter uma maneira de adicionar novamente. (Embora com zsh você pode escrever para o jobstates, jobdirse jobtextarrays associativos; eu não sei o quanto você pode conseguir dessa maneira.)

Se você deseja que o shell envie sinais para o processo renegado, assim como para seus subprocessos de propriedade, é possível escrever um trabalho de stub que aguarde até receber um sinal e envie o mesmo sinal ao processo renegado. Você pode enviar SIGSTOPe SIGCONTao processo renegado para simular Ctrl+ Ze bg. Nada disso será tão conveniente quanto a nova posse.

Gilles 'SO- parar de ser mau'
fonte
0

Quais são as circunstâncias? Se você quiser apenas recuperar o seu terminal por um tempo, você pode usar o GNU Screen . Não desanexa completamente o processo de um terminal - a tela emula um para o benefício do processo - mas você pode conectá-lo e desconectá-lo do terminal real que está usando. Você pode até desanexar uma tela, sair e, em seguida, efetuar login novamente e reconectá-la à mesma tela.

Scott
fonte
6
As circunstâncias são: Você nega o processo errado e deseja recuperá-lo.
nisc 2/09/10
1
Ah Mais difíceis. A tela precisa ser planejada.
Scott