Nohup remoto posterior com tcsh


11

Eu tenho uma instância tcsh em um xterm que está executando um processo de longo prazo (semanas?). O servidor Xvnc em que ele está sendo executado caiu no mato; consome 100% da CPU e não responde. (Este é um bug conhecido e 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 seja - e manter esse processo de longo prazo em execução?

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

Respostas:


17

Este post pode ajudar. A recomendação é:

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

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

A notícia realmente ruim é que a chamada rejeitada pode precisar ser feita no mesmo shell. Nesse caso, sim, você está ferrado. Mas não tenho certeza, talvez a raiz possa forçá-lo a desconectá-lo.

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

Se o tcsh sair anormalmente, ele rejeitará os trabalhos executados em segundo plano automaticamente quando sair.

Portanto, se seu processo de longo prazo já estiver em segundo plano, matar seu pai tcsh deve permitir que ele continue. O processo agora está desconectado do terminal inicial. (Caso contrário, consulte "más notícias" acima.)

Infelizmente, não é tela, então não há uma reconexão real. Você pode falsificá-lo com gdb, talvez (novamente, desde o primeiro link):

[...] com alguns hacks sujos, não é impossível reabrir um processo 'stdout / stderr / stdin.

Portanto, você ainda pode criar uma janela de tela em branco (por exemplo, que executa o modo de suspensão).

E então use o gdb, por exemplo, para se conectar ao processo, faça algumas chamadas de fechamento (0)
chamada de fechamento (1)
chamada de fechamento (2)
chamada de abertura ("/ dev / pts / xx", ...)
chamada de dup (0)
chamar dup (0)
desanexar

A saída do processo iria para a tela. Ele não seria anexado ao terminal da tela, então, por exemplo, [sic] mataria o comando "sleep", não o processo, mas isso poderia ser suficiente para o OP.

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


Sim, é um processo em primeiro plano, então acho que estou ferrado.
Wfaulk 2/10/09

Sim. mas como você disse, não é seu processo, não é sua culpa. desculpe você ficar preso com a bagunça, tho.
quack quixote

2
Isso totalmente acabou de me salvar. Encontrei o mesmo problema que publiquei inicialmente, que era o de que o processo estava bloqueando o STDOUT quando o servidor X (e, eu acho, o xterm no meio) se firmou. Acontece que eu realmente não precisava fazer nada, exceto fechar STDOUT. Essa produção era irrelevante; os dados reais estão em um arquivo de log em algum lugar. Então eu pude conectar com o gdb, executar "call close (1)" e depois "cont" e ele está se movendo novamente. Muito obrigado!
Wfaulk 12/12/09

Hã! interessante. que descongela tudo? estranheza. feliz que ajudou tho!
quack quixote

2
Vale a pena ressaltar que enviar "Ctrl-Z" para um processo em primeiro plano e enviar SIGSTOP para seu pid são a mesma coisa. (O SIGCONT inicia o processo novamente.) Não sei se isso seria útil para outras pessoas na mesma situação ou não, mas, nos meus testes rápidos, o envio do SIGSTOP seguido pelo SIGCONT duplica "Ctrl-Z" seguido por bg.
wfaulk

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.