Nohup remoto pós-fato com tcsh

10

Eu tenho uma instância tcsh em um xterm que está executando um processo de longo prazo (semanas?). O servidor Xvnc que está rodando sob saiu nas ervas daninhas; está consumindo 100% da CPU e não responde. (Esse é um bug conhecido e eu sei que é irrecuperável).

O processo de longo prazo está bloqueando no stdout.

Existe alguma maneira de matar um processo subjacente - o tcsh, o xterm, o que for - e manter esse processo de longo prazo em execução?

(Por favor, não há respostas sobre screen . Eu sei. Não é o meu processo; é um usuário. Eles não vão aprender.)

    
por wfaulk 02.10.2009 / 17:26

2 respostas

16

Esta postagem pode ajudar. A recomendação é:

  1. contextualize o processo (com Ctrl-Z e bg )
  2. execute disown -h% [jobid] (provavelmente um bash-ism, então você terá que traduzir para tcsh)

A má notícia , é claro, é que o bg precisa ser feito no mesmo shell em que o processo está sendo executado ... mas ... pode já estar em segundo plano.

A notícia muito ruim é que a chamada disown pode precisar ser feita no mesmo shell. Nesse caso, sim, você está ferrado. Mas não tenho certeza, talvez o root possa forçar a desconexão.

Hmm. Possíveis boas notícias - tcsh faz o rejeitar automaticamente:

If tcsh exits abnormally, it disowns jobs running in the background automatically when it exits.

Portanto, se seu processo de longo prazo já estiver em segundo plano, a eliminação de seu pai tcsh deve permitir que ele continue. O processo agora está desconectado do terminal inicial. (Se não, veja "más notícias" acima.)

Infelizmente, não é tela, então não há uma reconexão real. Você pode fingir com o gdb talvez (novamente, a partir do primeiro link):

[...] with some dirty hacks, it is not impossible to reopen a process' stdout/stderr/stdin.

So you could still create a blank screen window (for instance that runs sleep).

And then use gdb for instance to attach to the process, do some call close(0)
call close(1)
call close(2)
call open("/dev/pts/xx", ...)
call dup(0)
call dup(0)
detach

The process' output would go to screen. It wouldn't be attached to that screen terminal, so for instance[sic] would kill the "sleep" command, not the process, but that could be enough for the OP.

Gostaria de saber se não deveria haver "call dup (1)" e "call dup (2)" nesse processo também ...

    
por 02.10.2009 / 17:57
3

Estas questões referem-se a um programa chamado Cryopid, que pode ajudá-lo. Eu não tenho nenhuma experiência com isso, no entanto.

Movendo um processo entre hosts

Movendo xterms entre sessões X

Nohup e exiba um processo

    
por 04.10.2009 / 22:36

Tags