Como separar completamente um processo

5

Eu quero gerar um processo e executá-lo no nível superior para que, quando o shell sair, o processo continue sendo executado.

Eu erroneamente pensei que nohup faria isso, mas quando eu sair do shell (o shell é um contêiner lxc e eu ssh para isso) e re-entrar, o processo se foi.

Parece (olhando para o pstree) que o processo ainda está sob o shell invocador mesmo com nohup ou disown.

Eu tentei algumas opções e o setsid parece funcionar - mas estou fazendo algo errado com o nohup aqui?

$ cat myproc
sleep 1234

$ myproc &
$ pstree -a | grep -B 3 "1234" | grep -v grep
  |-screen 
  |   |-bash -ls
  |   |   |-bash -ls
  |   |   |   '-sleep 1234


$ nohup myproc &
$ pstree 
  |-screen 
  |   |-bash -ls
  |   |   |-pstree -a
  |   |   '-sh ./myproc
  |   |       '-sleep 1234

$ myproc &
$ disown $!
$ pstree -a | grep -B 3 "1234" | grep -v grep
  |-screen 
  |   |-bash -ls
  |   |   |-bash -ls
  |   |   |   '-sleep 1234

$ setsid myproc &
  |-sh ./myproc
  |   '-sleep 1234

sucesso. Mas por que nohup não conseguiu o mesmo? Existe uma maneira de usar o nohup mais corretamente?

    
por Neil McGill 17.09.2014 / 21:57

3 respostas

3

É um pouco difícil de diagnosticar, já que você não dá origem a myproc , mas eu suspeito que o seu problema tenha algo a ver com " controlando TTY ". Eu escrevi um pequeno script de shell que apenas chama sleep 100 . Eu rand ele em nohup :

-bash-3.2 $ nohup ./sleeper > sleeper.out &

[1] 25305
-bash-3.2$ jobs
[1]+  Running                 nohup ./sleeper > sleeper.out &
-bash-3.2$ ps -l -p 25305
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S 429624 25305 18252  0 77   0 - 15961 wait   pts/0    00:00:00 sleeper

Se você olhar para a saída ps , verá uma coluna chamada " TTY ". Pelo menos algumas versões de nohup (a que usei acima é do GNU coreutils, versão 5.97, tão antiga). Quando saí do bash shell do qual iniciei sleeper , a coluna TTY mudou para '?', Significando que sleeper não tinha um.

Se myproc não se separar deliberadamente do controle do TTY, ainda é possível obter coisas como um sinal SIGPIPE se ele tentar gravar no stdout. Parece-me que outras coisas são possíveis, mas não consigo me lembrar ou pesquisar no Google.

Se você puder encontrar ou compilar " daemonize ", você pode querer testá-lo. Se myproc for compilado, você poderá modificar a origem para chamar a função de biblioteca daemon(3) .

    
por 17.09.2014 / 22:30
2

Você pode usar at para isso.

The at utility shall read commands from standard input and group them together as an at-job, to be executed at a later time.

The at-job shall be executed in a separate invocation of the shell, running in a separate process group with no controlling terminal, except that the environment variables, current working directory, file creation mask, and other implementation-defined execution-time attributes in effect when the at utility is executed shall be retained and used when the at-job is executed.

echo myproc | at now

... funcionará, embora em alguns sistemas você precise configurar o monitor do daemon at primeiro.

    
por 24.01.2016 / 11:33
1

Para desanexar completamente um processo:

nohup ./command &

stdout & stderr será gravado em um arquivo chamado nohup.out localizado no mesmo diretório onde o nohup foi executado.

Se você deseja executar um comando desanexado enquanto pode ver a saída no terminal, use tail:

TEMP_LOG_FILE=tmp.log
> "$TEMP_LOG_FILE"
nohup ./command &> "$TEMP_LOG_FILE" & tail -f "$TEMP_LOG_FILE" &
    
por 15.03.2016 / 11:56