Quando você fecha uma janela do Terminal do GNOME, um SIGHUP é enviado para o shell que estava sendo executado. O shell normalmente envia um SIGHUP para cada grupo de processos que ele sabe que criou - mesmo aqueles iniciados com nohup
- e então sai. Se o shell for bash
, ele ignorará o envio de um SIGHUP para qualquer grupo de processos que o usuário marcou com disown
.
Executar um comando com nohup
faz com que ele ignore SIGHUP, mas o processo pode mudar isso. Quando a disposição de SIGHUP para um processo é o padrão, então se ele receber um SIGHUP, o processo será encerrado.
O Linux fornece algumas ferramentas para examinar as configurações de sinal de um processo em execução.
O script de shell do navegador do cromo faz um exec
do aplicativo compilado, portanto, seu ID de processo permanece o mesmo. Então, para ver suas configurações de sinal, eu corri nohup chromium-browser &
e depois olhei para /proc/$!/status
para ver a disposição do sinal.
SigBlk: 0000000000000000
SigIgn: 0000000000001000
SigCgt: 0000000180014003
Esses são números hexadecimais. Isso mostra que SIGHUP não é capturado e não é ignorado. Apenas o SIGPIPE (o 13º bit no SigIgn) é ignorado. Rastreei isso para o seguinte código :
// Setup signal-handling state: resanitize most signals, ignore SIGPIPE.
void SetupSignalHandlers() {
// Sanitise our signal handling state. Signals that were ignored by our
// parent will also be ignored by us. We also inherit our parent's sigmask.
sigset_t empty_signal_set;
CHECK(0 == sigemptyset(&empty_signal_set));
CHECK(0 == sigprocmask(SIG_SETMASK, &empty_signal_set, NULL));
struct sigaction sigact;
memset(&sigact, 0, sizeof(sigact));
sigact.sa_handler = SIG_DFL;
static const int signals_to_reset[] =
{SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGABRT, SIGFPE, SIGSEGV,
SIGALRM, SIGTERM, SIGCHLD, SIGBUS, SIGTRAP}; // SIGPIPE is set below.
for (unsigned i = 0; i < arraysize(signals_to_reset); i++) {
CHECK(0 == sigaction(signals_to_reset[i], &sigact, NULL));
}
// Always ignore SIGPIPE. We check the return value of write().
CHECK(signal(SIGPIPE, SIG_IGN) != SIG_ERR);
}
Apesar do comentário, os sinais ignorados pelo pai não são ignorados. Um SIGHUP matará o cromo.
A solução alternativa é fazer o que @ xx4h indica: use o comando disown
em seu bash para que, se o bash precisar sair, ele não envie SIGHUP para o grupo de processos chromium-browser
. Você pode escrever uma função para fazer isso:
mychromium () { /usr/bin/chromium-browser & disown $!; }