Como executar um processo e desanexá-lo completamente do seu shell pai [duplicado]

3

Estou executando um programa em um servidor linux que levará dias para ser concluído.

Vou lançá-lo da minha estação de trabalho a partir de um terminal SSH, já que este programa é somente de linha de comando.

Eu quero poder fazer tudo isso:

  • inicie esse programa,
  • redireciona saídas padrão para arquivos,
  • sai da minha sessão SSH sem que isso termine o processo.

Eu pensei em $ ./MyProg.csh -params -foo -bar </dev/null 1>~/out.log 2>~/err.log &

No entanto, o processo é finalizado no momento em que fecho minha sessão SSH. Minha estação de trabalho está executando o Windows XP e não posso garantir seu tempo de atividade por vários dias, o que é necessário para o processamento de meus dados no servidor Linux.

Como você deve ter notado, meu programa precisa ser lançado da CSH.

É possível fazer isso?

Obrigado.

    
por Benoit Duffez 17.11.2011 / 17:36

3 respostas

8

você pode usar o usuário screen ou nohup

se você escolher screen :

inicie screen antes de executar seu serviço:

$ screen

e, em seguida, execute seu serviço dentro do screen :

./MyProg.sh > myprog.log (ou qualquer coisa que você queira aqui).

e depois Ctrl + a d

quando você voltou, apenas:

$ screen -r

para mais informações: link

sobre o nohup: apenas:

nohup ./MyProg.sh > myprog.log &

    
por 17.11.2011 / 17:43
1

Crie um wrapper de shell assim:

#!/bin/sh
exec </dev/null
exec >> ~/out.log
exec 2>> ~/err.log
exec setsid ./MyProg.csh -params -foo -bar

Se você precisar de arquivo PID também, envie este script de shell para bg e leia $! (PID do último processo bg). Você pode fazer isso usando subshell com () no mesmo script como este:

#!/bin/sh
( exec </dev/null
  exec >> ~/out.log
  exec 2>> ~/err.log
  exec setsid ./MyProg.csh -params -foo -bar
) &
kill -0 $! > /dev/null 2>&1 || exit 1
echo $! > program.pid
exit 0
    
por 17.11.2011 / 18:33
0

A conexão cai porque o shell envia SIGHUP para todos os filhos quando sai. Se você usar bash ou zsh, poderá usar disown e o shell não enviará mais SIGHUP e os processos permanecerão por aí.

screen e setsid acima funcionam, mas essa resposta tem a vantagem de não precisar se lembrar de fazer a tela antes de iniciar qualquer coisa. screen tem muito poder além disso, então você pode querer ter o hábito de usá-lo.

    
por 17.11.2011 / 22:12

Tags