Posso nohup / screen um processo já iniciado?

249

Estou fazendo algumas execuções de teste de scripts de migração de dados de longa duração, por SSH. Digamos que eu comece a executar um script por volta das 4 da tarde; agora, 6 da tarde, e eu estou me xingando por não fazer isso tudo em screen .

Existe alguma maneira de "retroativamente" nohup um processo ou eu preciso deixar meu computador on-line a noite toda? Se não for possível anexar screen a / nohup um processo que eu já iniciei, então por quê? Algo a ver com como os procesos pai / filho interagem? (Eu não vou aceitar uma resposta "não" que, pelo menos, não aborda a questão do "porquê" - desculpe;))

    
por ojrac 12.06.2009 / 00:53

12 respostas

201

Se você estiver usando o Bash, poderá executar disown -h job

disown

disown [-ar] [-h] [jobspec ...]

Without options, each jobspec is removed from the table of active jobs. If the -h option is given, the job is not removed from the table, but is marked so that SIGHUP is not sent to the job if the shell receives a SIGHUP. If jobspec is not present, and neither the -a nor -r option is supplied, the current job is used. If no jobspec is supplied, the -a option means to remove or mark all jobs; the -r option without a jobspec argument restricts operation to running jobs.

    
por 12.06.2009 / 01:03
77

Use reptyr

Do README:

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

Alguns posts de seu autor:

por 22.05.2011 / 23:27
22

Para roubar um processo de um tty para o seu tty atual, você pode tentar esse hack:

link

Ele precisa de uma reformatação para poder compilar para as versões atuais do Linux / glibc, mas ainda funciona.

    
por 12.06.2009 / 07:38
16

Quando um processo é iniciado, STDIN, STDOUT e STDERR são conectados a algo . Geralmente você não pode mudar isso depois que o comando é iniciado. No caso que você está descrevendo, provavelmente é um tty associado à sessão ssh. nohup praticamente só faz ...

command < /dev/null > nohup.out 2>&1

Ou seja, configura STDIN para / dev / null, STDOUT para um arquivo e STDERR para STDOUT. Screen faz coisas muito mais sofisticadas envolvendo a configuração de ttys que direcionam para si mesmo.

Eu não sei de nenhuma maneira de retroativamente nohup ou screenize um processo em execução. Se você cd para / proc / $ pid / fd e ver o que 0, 1 e 2 apontam para.

Você pode ter alguma sorte com o disown, mas não se o processo tentar fazer algo com STDIN, STDOUT ou STDERR.

    
por 12.06.2009 / 01:04
12

Cryopid é um desenvolvimento adicional do autor de grab.c que congela um processo para um arquivo, que você executa (dentro tela) para retomar o processo.

    
por 14.06.2009 / 20:26
11

Eu só posso dar-lhe um simples "Não" sem o porquê da parte da tela, eu estaria interessado na razão de você mesmo.

No entanto você já tentou disown (um bash builtin)

~ $ echo $SHELL
/bin/bash
~ $ type disown
disown is a shell builtin
~ $ help disown
disown: disown [-h] [-ar] [jobspec ...]
     By default, removes each JOBSPEC argument from the table of active jobs.
    If the -h option is given, the job is not removed from the table, but is
    marked so that SIGHUP is not sent to the job if the shell receives a
    SIGHUP.  The -a option, when JOBSPEC is not supplied, means to remove all
    jobs from the job table; the -r option means to remove only running jobs.
    
por 12.06.2009 / 01:02
9

nohup no Solaris / OpenSolaris tem um sinalizador -p para nohup um processo em execução - por exemplo, veja o Solaris 10 página de manual nohup .

    
por 13.06.2009 / 02:59
5

Recentemente, vi um link para o neercs , que é um utilitário semelhante a uma tela, construído com a libcaca, uma cor ascendente. biblioteca de arte. Entre outros recursos, possui a capacidade de capturar um processo existente e reproduzi-lo dentro de sua sessão de neercs (tela).

Eu não usei, no entanto, não posso comentar se funciona ou não.

    
por 14.06.2009 / 23:03
2

Eu provavelmente estou pensando nisso, então sinta-se à vontade para me corrigir (eu já aprendi sobre o disown!) ... Não funcionaria um ctrl-Z e um "bg" para pelo menos fazer o processo rodar em segundo plano? ? Ou é o principal problema que você ainda deseja ver o STDOUT enquanto ele é executado?

    
por 12.06.2009 / 01:08
2

Se você pode viver com a incapacidade de interagir com o processo e não se opõe ao carregamento de módulos aleatórios do kernel, você poderia fazer pior do que olhar para Snoop . Alternativamente, existem alguns outros projetos. Aqui é um call injcode, que geralmente pode fazer o que você quer fazer.

    
por 12.06.2009 / 01:35
1

Eu queria usar nohup (ou similar) para iniciar o navegador de linha de comando links e anexar a ele depois para baixar um arquivo do site ASP.NET com processo de autenticação complicado e muito estado de exibição oculto que dificultou o uso do trabalho com curl / wget .

Eu finalmente acabei usando tmux , o que resolveu o trabalho simplesmente:

  1. Executar tmux
  2. Execute seu aplicativo ( links no meu caso) e deixe-o em exibição
  3. Feche a sessão SSH, o aplicativo permanecerá em execução
  4. Conecte-se com o SSH à mesma máquina mais tarde e execute tmux attach para trazer o aplicativo de volta à tela
por 17.08.2017 / 18:18
-1

Você está preocupado com o tempo limite da sessão? Nesse caso, você poderia Ctrl-z e bg o processo e, em seguida, basta colocar algo para manter a sessão viva como um "ping -t localhost" ou "top".

Se você deseja sair, receio não poder adicionar outros comentários.

    
por 12.06.2009 / 01:58