Como anexar o terminal ao processo separado?

82

Eu desanexei um processo do meu terminal, assim:

$ process &

Esse terminal agora está fechado há muito tempo, mas o processo ainda está em execução e quero enviar alguns comandos para o stdin desse processo. Isso é possível?

    
por Rogach 16.02.2012 / 12:25

5 respostas

97

Sim, é. Primeiro, crie um pipe: %código%.  Use o gdb para anexar ao processo: mkfifo /tmp/fifo

Em seguida, feche stdin: gdb -p PID ; e abra-o novamente: call close (0)

Finalmente, escreva (de um terminal diferente, como o gdb provavelmente irá travar):

call open ("/tmp/fifo", 0600)

    
por 16.02.2012 / 14:34
15

Eu estava procurando uma maneira de conectar um processo existente ao meu terminal atual principalmente pela mesma razão (o terminal original não estava mais acessível).

repty pode ser o que você quer, veja link

Cite de lá:

Dê uma olhada no reptyr , que faz exatamente isso. A página do github tem todas as informações.

reptyr - A tool for "re-ptying" programs.

reptyr is a utility for taking an existing running program and attaching it to a new terminal. Started a long-running process over ssh, but have to leave and don't want to interrupt it? Just start a screen, use reptyr to grab it, and then kill the ssh session and head on home.

USAGE

reptyr PID

"reptyr PID" will grab the process with id PID and attach it to your current terminal.

After attaching, the process will take input from and write output to the new terminal, including ^C and ^Z. (Unfortunately, if you background it, you will still have to run "bg" or "fg" in the old terminal. This is likely impossible to fix in a reasonable way without patching your shell.)

    
por 06.01.2017 / 23:52
12

Tenho certeza que você não pode.

Verifique usando ps x . Se um processo tiver um ? como controlando tty , você não poderá mais enviar entrada para ele.

9942 ?        S      0:00 tail -F /var/log/messages
9947 pts/1    S      0:00 tail -F /var/log/messages

Neste exemplo, você pode enviar a entrada para 9947 fazendo algo como echo "test" > /dev/pts/1 . O outro processo ( 9942 ) não está acessível.

Na próxima vez, você pode usar a tela ou tmux para evitar essa situação.

    
por 16.02.2012 / 12:53
6

EDITAR : Como Stephane Gimenez disse, não é assim tão simples. Está apenas permitindo que você imprima em um terminal diferente.

Você pode tentar escrever para este processo usando / proc . Ele deve estar localizado em / proc / pid / fd / 0 , portanto, é simples:

echo "hello" > /proc/PID/fd/0

deve fazer isso. Eu não tentei, mas deve funcionar, contanto que este processo ainda tenha um descritor de arquivo stdin válido. Você pode verificar com ls -l em / proc / pid / fd / .

  • se for um link para / dev / null = > está fechado
  • se for um link para / dev / pts / X ou um soquete = > está aberto

Veja nohup para mais detalhes sobre como manter processos em execução.

    
por 16.02.2012 / 14:09
3

Acabar de terminar a linha de comando com & não irá separar completamente o processo, apenas o executará em segundo plano. (Com zsh você pode usar &! para realmente desanexá-lo, caso contrário você terá disown depois).

Quando um processo é executado em segundo plano, ele não receberá mais entrada de seu terminal de controle. Mas você pode enviá-lo de volta para o primeiro plano com fg e, em seguida, lerá a entrada novamente.

Caso contrário, não é possível alterar externamente seus descritores de arquivo (incluindo stdin) ou reconectar um terminal de controle perdido ... a menos que você use ferramentas de depuração (consulte Resposta do Ansgar , ou dê uma olhada no comando retty ).

    
por 16.02.2012 / 17:03