Por que processo é morto com nohup

2

Eu quero rodar um processo em segundo plano, sem matá-lo na saída do shell, de acordo com o conceito Nohup, o seguinte comando deve funcionar até que eu o mate manualmente:

nohup uwsgi --http :8008  --module crawled_data_center.wsgi > /dev/null &

Estou logado com o usuário root para shell, mas depois de sair do shell, o processo foi finalizado. Parece estranho porque eu usei nohup várias vezes em vários projetos e funciona corretamente, mas neste caso eu sughei, qual é o problema e como posso executá-lo em segundo plano sem matá-lo na saída do shell?

Atualização:

Eu lidei com:

$ nohup uwsgi --http :8008  --module crawled_data_center.wsgi > /dev/null &
$ disown -l
$ disown -h JOBID

Mas minha pergunta é sobre como isso poderia ser possível. SIGHUP poderia matar nohup e & ?

Aqui está o conteúdo de /etc/systemd/logind.conf :

[Login]
#NAutoVTs=6
#ReserveVT=6
#KillUserProcesses=no
#KillOnlyUsers=
#KillExcludeUsers=root
Controllers=blkio cpu cpuacct cpuset devices freezer hugetlb memory perf_event net_cls net_prio
ResetControllers=
#InhibitDelayMaxSec=5
#HandlePowerKey=poweroff
#HandleSuspendKey=suspend
#HandleHibernateKey=hibernate
#HandleLidSwitch=suspend
#PowerKeyIgnoreInhibited=no
#SuspendKeyIgnoreInhibited=no
#HibernateKeyIgnoreInhibited=no
#LidSwitchIgnoreInhibited=yes
#IdleAction=ignore
#IdleActionSec=30min
    
por Yusef Mohamadi 30.01.2018 / 07:34

1 resposta

4

Tanto quanto sei, há duas situações que podem fazer com que um processo seja eliminado após ser protegido por nohup e cada situação tenha uma solução diferente.

Uma possibilidade, que não parece ser o caso aqui, é que o sistema usa systemd onde logind.conf está configurado com KillUserProcesses=yes . Neste caso, fechar o terminal não causará problemas, mas o logout do sistema irá causar problemas. A solução alternativa neste caso é usar

$ systemd-run --scope --user [command]

Isso basicamente diz ao systemd que ele não deve matar o processo.

A outra possibilidade é que o processo gerado implemente seu próprio manipulador para SIGHUP , que substitui a proteção de nohup . Nesse caso, problemas ocorrerão assim que o shell for fechado, mesmo se você permanecer conectado. Você pode verificar isso com:

$ nohup [command] &
$ grep Sig /proc/$!/status

Você deve ver uma linha

SigIgn: 0000000000000001

(ou alguma outra seqüência de dígitos hexadecimais). SIGHUP é o número de sinal 1 , portanto, se esse número hexadecimal big-endian tiver seu primeiro conjunto de bits (menos significativo) (isto é, o dígito final é um de 1, 3, 5, 7, 9, B, D, ou F), então SIGHUP é ignorado. Caso contrário, o programa instalou seu próprio manipulador, sobrescrevendo a proteção de nohup .

Nesse caso, a solução é usar disown :

nohup [command] & disown

Isso remove o processo da lista de tarefas do shell, evitando que SIGHUP seja enviado em primeiro lugar.

    
por 30.01.2018 / 13:48