O processo em que o cmd deve ser executado será eliminado pelo sinal SIGHUP entre o fork () e o exec (), e qualquer wrapper nohup ou outro material não terá chance de ser executado e ter qualquer efeito. (Você pode verificar isso com strace )
Em vez de nohup , você deve definir SIGHUP para SIG_IGN (ignore) no shell pai antes de executar o comando background; Se um manipulador de sinal estiver definido como 'ignore' ou 'default', essa disposição será herdada através de fork () e exec (). Exemplo:
#! /bin/sh
trap '' HUP # ignore SIGHUP
xclock &
trap - HUP # back to default
Ou:
#! /bin/sh
(trap '' HUP; xclock &)
Se você executar este script com xfce4-terminal -H -x script.sh , o comando de segundo plano ( xclock & ) não será eliminado pelo SIGHUP enviado quando script.sh terminar.
Quando um líder de sessão (um processo que "possui" o terminal de controle, script.sh no seu caso) terminar, o kernel enviará um SIGHUP para todos os processos de seu grupo de processos foreground ; mas set -m ativará o controle de tarefas e os comandos iniciados com & serão colocados em um grupo de processos background , e eles não serão sinalizados por SIGHUP .
Se o controle de trabalho não estiver ativado (o padrão para um script não interativo), os comandos iniciados com & serão executados no mesmo grupo de processos primeiro plano e o modo "segundo plano" ser falsificado por redirecionando sua entrada de /dev/null e permitindo que eles ignore SIGINT e SIGQUIT .
Processos iniciados dessa maneira a partir de um script que, uma vez executado como um trabalho em primeiro plano, mas que já tenha saído, não serão sinalizados com SIGHUP , pois o grupo de processos (herdado do pai morto) não é mais o primeiro plano no terminal.
Notas extras:
O 'modo hold' parece ser diferente entre xterm e xfce4-terminal (e provavelmente outros terminais baseados em vte). Enquanto o primeiro manterá o lado mestre do arquivo aberto, este último irá separá-lo depois que o programa rodar com -e ou -x tenha saído, fazendo com que qualquer gravação no lado escravo falhe com EIO . xterm também ignorará WM_DELETE_WINDOW mensagens (isto é, não fechará) enquanto ainda houver processos do grupo de processos em primeiro plano em execução.