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.

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!".


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).


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

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.


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.