O processo em segundo plano de um script ainda está ativo após o fechamento do terminal

6

Esta é mais uma questão de gerenciamento de processos / manipulação de sinais do que uma questão de Bash. Apenas usa o Bash para explicar o problema.

Estou executando um script Bash no qual executo um processo em segundo plano. Este é o script:

#!/bin/bash

# ...

# The background process
{ 
  while :; do
    sleep 1 && echo foo >> /path/to/some/file.txt
  done
} &

# ...

exit 0

NÃO executo o script em segundo plano. Simplesmente ./script .

A opção shell "huponexit" é ativada usando shopt -s huponexit , portanto, quando o terminal está sendo fechado, espero que ele envie um sinal HUP para Bash, que irá propagá-lo até atingir o processo em segundo plano. Se o processo em segundo plano não for trap e ignorar o sinal, ele também será eliminado - mas isso não está acontecendo. O processo em segundo plano atua como se fosse disown 'ed.

Este é um esquema que desenho para ilustrar o assunto. O esquema, junto com a descrição acima, pode estar errado, já que tenho certeza de que não entendo bem o assunto. Por favor, corrija-me se for realmente o caso.

Eu quero saber por que o processo em segundo plano não está sendo eliminado depois de fechar o terminal, como se ele fosse invocado por um shell interativo como esse:

rany@~/Desktop$ while :; do sleep 1 && echo foo >> /path/to/some/file.txt; done &

Não tenho certeza, mas acho que a resposta à minha pergunta está no fato de que Bash fork () é um shell não interativo para executar o script, que pode ter um conjunto diferente de regras para controle de tarefas e manipulação de sinais.

    
por Rany Albeg Wein 22.04.2013 / 00:03

1 resposta

3

Então, o que a página man nos diz sobre huponexit ?

If the huponexit shell option has been set with shopt, bash sends a SIGHUP to all jobs when an interactive login shell exits.

EDIT: Enfatizando que é um shell de LOGIN.

EDIT 2: interativo merece igual ênfase

    
por 22.04.2013 / 00:37