Por que os trabalhos não são eliminados no logout quando executados com “/ dev / null 2 & 1 &”?

5

Quando você executa trabalhos como o exemplo abaixo, eles são mortos quando você faz logout:

$ ./job.sh &

No entanto, quando você os executa como no exemplo abaixo, redirecionando o stdout para /dev/null e stderr para stdout, bem como colocando o trabalho em segundo plano, eles não são mortos quando você efetua logout. É um pouco como nohup, exceto que a saída vai para /dev/null ao invés de um arquivo.

$ ./job.sh > /dev/null 2>&1 &

Percebi que alguns daemons funcionam assim e fiquei curioso em saber o motivo pelo qual eles não são mortos no logout.

Alguém pode me explicar por quê?

EDIT 1:

Como sugerido por @Patrick em seu comentário, tentei o mesmo com o trabalho mais simples de todos os tempos e o resultado é o mesmo: o trabalho não morre quando eu me desconectar.

# while true; do sleep 1; done > /dev/null 2>&1 &
[1] 4320
# logout

luis-macbook:~ luis$
luis-macbook:Downloads luis$ ssh server
luis.alen@server's password: 
# jobs
#
# ps -ef | grep 4320
root      4320     1  0 01:17 ?        00:00:00 -bash

EDIT 2:

Como solicitado por Patrick novamente, fiz o mesmo teste sem redirecionar os streams e, para minha surpresa, o processo não morreu. Agora estou completamente confuso ... Eu juro que me lembro de processos colocados no fundo morrendo quando você desconectou. Estou absolutamente errado?

# while true; do sleep 1; done &
[1] 20720
# logout
luis-macbook:~ luis$ ssh server
# jobs
#
# ps -ef | grep 20720
root     20720     1  0 23:31 ?        00:00:00 -bash
    
por Luis Fernando Alen 08.03.2012 / 23:58

2 respostas

3

Como os daemons, é porque querem que qualquer mensagem de saída ou erro que possam produzir seja descartada, independentemente de como você redirecionar os fluxos de entrada e saída de um processo, ele ainda será SIGHUP'd se estiver conectado a uma sessão e essa sessão está fechada para deixar os processos em execução.

Para deixar os processos em execução, há poucas abordagens:

  1. separe-os da sessão - os daemons fazem isso forçando um novo processo e, em seguida, saindo do processo original; agora o novo processo não tem pai e é adotado por init você também pode realizar isso usando o comando interno bash disown

  2. use nohup para impedir que o processo receba o SIGHUP quando a sessão morrer; o processo não obtém SIGHUP, não sai, seu pai morre e o init o adota

  3. anexa a uma sessão que não morre - use a tela

Por favor, verifique novamente o seu trabalho na declaração "Jobs não são mortos no logout quando executados com > /dev/null 2>&1 & "

    
por 09.03.2012 / 00:30
0

É o comportamento dos jobs no bash, até onde eu sei, fiz um teste aqui e ele continuou rodando com esses streams abertos também:

sergiopa@sergiopa:~/Downloads$ find / -print >/dev/null 2>&1 &
[1] 14152
sergiopa@sergiopa:~/Downloads$ jobs
[1]+  Running                 find / -print > /dev/null 2>&1 &
sergiopa@sergiopa:~/Downloads$ ps -ef | grep find
sergiopa 14152 13913 10 15:47 pts/18   00:00:01 find / -print
sergiopa 14195 13913  0 15:48 pts/18   00:00:00 grep --color=auto find
sergiopa@sergiopa:~/Downloads$ 

sergiopa@sergiopa:~/Downloads$ lsof -c find
COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
find    14152 sergiopa  cwd    DIR  252,1     4096     4808 /usr/src/linux-headers-2.6.35-22/drivers/rapidio
find    14152 sergiopa  rtd    DIR  252,1     4096        2 /
find    14152 sergiopa  txt    REG  252,1   141980   391686 /usr/bin/find
find    14152 sergiopa  mem    REG  252,1  1421892    26489 /lib/libc-2.12.1.so
find    14152 sergiopa  mem    REG  252,1   118084    26452 /lib/ld-2.12.1.so
find    14152 sergiopa  mem    REG  252,1   149392    26485 /lib/libm-2.12.1.so
find    14152 sergiopa  mem    REG  252,1    30684    26469 /lib/librt-2.12.1.so
find    14152 sergiopa  mem    REG  252,1   121578    26490 /lib/libpthread-2.12.1.so
find    14152 sergiopa  mem    REG  252,1  2768240   391861 /usr/lib/locale/locale-archive
find    14152 sergiopa    0u   CHR 136,18      0t0       21 /dev/pts/18 <<<<
find    14152 sergiopa    1w   CHR    1,3      0t0     4293 /dev/null   <<<<
find    14152 sergiopa    2w   CHR    1,3      0t0     4293 /dev/null   <<<<
find    14152 sergiopa    3r   DIR  252,3     4096 16777344 /home/sergiopa/Downloads
find    14152 sergiopa    4r   DIR  252,3     4096 16777344 /home/sergiopa/Downloads
find    14152 sergiopa    5r   DIR  252,1     4096     4808 /usr/src/linux-headers-2.6.35-22/drivers/rapidio
sergiopa@sergiopa:~/Downloads$ 

Veja as linhas com '< < < <', estas são STDIN, STDOUT e STDERR. Fechado o shell, mas ainda está sendo executado.

Espero que ajude!

    
por 15.03.2012 / 19:50