Estou tentando entender a necessidade de usar nohup
comandos em segundo plano no ssh. Meu shell é csh no CentOS.
O comando em segundo plano abaixo continua em execução mesmo após a saída do ssh. Eu esperava que isso só acontecesse se
nohup
estivesse prefixando o comando.Qual é o cenário onde
nohup
seria necessário?ssh host 'sleep 80 >& /dev/null &'
Também tentei um shell interativo, e o PID do trabalho em segundo plano ainda existe no host após a saída do ssh.
ssh host sleep 80 >& /dev/null & exit
Também tentei encerrar a sessão interativa com
kill -HUP PID
em vez deexit
, e o PID do trabalho em segundo plano ainda existe no host após a saída do ssh.
Estou fazendo alguma coisa errada?
Responder1
Não, umfundoo grupo de processos (trabalho) NÃO é eliminado por padrão quando o líder da sessão (o shell) sai ou quando seu terminal de controle é desativado.
Existem apenas alguns casos especiais em que isso acontece:
(1)O trabalho em segundo plano éparou, caso em que será enviado um SIGHUP
/ SIGCONT
par de sinais pelonúcleo. Se o SIGHUP
sinal não for capturado ou ignorado por um processo, o processo será encerrado.
A definição de trabalho interrompido é: qualquer trabalho que contenha um processo interrompido. Um processodormindoem uma chamada de sistema de bloqueio como nanosleep(2)
ou read(2)
NÃO é considerada interrompida.
(2)Um processo tenta ler ou escrever no terminal que não existe mais e sai (por sua própria vontade) devido aos erros que obtém ao tentar fazê-lo.
(3)O trabalho é na verdade umprimeiro planotrabalho. Onúcleoenvia um SIGHUP
sinal para o grupo de processos em primeiro plano quando o processo líder/controlador da sessão (ou seja, o shell) termina. O próprio processo de controle é sinalizado SIGHUP
quando seu terminal de controle é desmontado, o que geralmente faz com que ele seja encerrado.
Mesmo os comandos iniciados &
fazem parte doprimeiro planogrupo de processos quando eles são iniciados a partir de um shell sem controle de trabalho (que na maioria dos shells --mas não em csh-- é o padrão ao executarroteirosesubcamadas).
(4)Você está usando um shell como bash
or zsh
, que se esforça para enviar um SIGHUP
sinal para todos os seus trabalhos quando ele próprio é sinalizado SIGHUP
(de acordo com o ponto 3. acima, o shell é o processo de controle) ou simplesmente quando ele sai (o último apenas o padrão em zsh
, mas não o padrão e sujeito à shopt huponexit
opção em bash).
Oshell csh(seja o real csh
ou tcsh
)não tem esse comportamentode bash
ou zsh
. Em tcsh
(mas NÃO no real csh
), você pode iniciar um comando com o hup
builtin para que ele seja ativado quando o shell sair:
tcsh% hup sleep 3600 &
tcsh% exit
$ pgrep sleep
[nothing]
(5)Seu sistema init faz de tudo para limpar qualquer sessão de usuário encerrada. Em sua configuração padrão,sistemasinalizará todos os processos de umescopocom um SIGTERM
seguido por um SIGKILL
após um atraso, então nohup
NÃO irá ajudá-lo com isso de qualquer maneira. Além disso, a ideia do systemd de umescoponão corresponde a uma sessão de processo Unix, portanto, executar um comando with setsid(1)
também não permitirá que ele escape.
Você provavelmente pode alterar o comportamento do systemd alterando seus padrões KillUserProcesses=yes
, as opções KillMode=control-group
, KillSignal=SIGTERM
e .SendSIGKILL=yes