Após o login ssh
, digite este comando bash
:
sleep 50000000000000 &
Em seguida, kill -9
o sleep
processo pai do processo (isto é, bash
). Então a janela do terminal se desconecta simultaneamente.
Ao efetuar login novamente, percebo que o sleep
processo ainda está ativo.
Pergunta : Por que o sleep
processo pode sobreviver quando eu saio e o terminal é fechado? Na minha opinião, tudo, exceto daemons e nohup
programas, será morto durante o logout. Se sleep
puder sobreviver dessa maneira, isso significa que eu posso usar esse método em vez do nohup
comando?
&
colocará o processo em segundo plano (como daemon) e continuará sendo executado mesmo que você esteja desconectado.Respostas:
Tl; dr:
A menos que a
bash
instância geradassh
tenha ahuponexit
opção definida, nenhum processo será encerrado por qualquer meio ao sair / sair e, quando ahuponexit
opção for definida, o usokill -9
no shell não será uma boa alternativa ao usonohup
nos processos filhos do shell;nohup
nos processos filhos do shell ainda os protegerão de SIGHUPs que não saem do shell, e mesmo quando isso nãonohup
for importante, ainda será o preferido, pois permite que o shell seja finalizado normalmente.Em
bash
há uma opção chamadahuponexit
, que se conjunto vai fazerbash
SIGHUP seus filhos ao sair / logout;Em instâncias interativas de não logon
bash
, como em umabash
instância gerada porgnome-terminal
, essa opção é ignorada; sehuponexit
está definido ou não,bash
os filhos de SUNUPUP nunca serão ASSOCIADOSbash
ao sair;Nas instâncias de logon interativo
bash
, como em umabash
instância gerada porssh
, essa opção não é ignorada (no entanto, é desativada por padrão); sehuponexit
for definido,bash
os filhos de SIGHUP serão buscadosbash
ao sair / sair; se não estiver definidohuponexit
,bash
os filhos de SIGHUPped não serão encontradosbash
após a saída / logout;Portanto, em geral, sair / sair de uma
bash
instância de logon interativo , a menos que ahuponexit
opção esteja definida, não tornará o shell SIGHUP seus filhos e sair / sair de umabash
instância de não-logon interativo não fará o shell SIGHUP seus filhos independentemente;Isso é, no entanto, irrelevante neste caso: o uso
kill -9
sleep
sobreviverá independentemente, porque matar o processo pai (bash
) não permitirá que o último faça algo com o anterior (por exemplo, se abash
instância atual for umabash
instância de login) e ahuponexit
opção foi configurada para SIGHUP it).Além disso, diferentemente de outros sinais (como um sinal SIGHUP enviado para
bash
), um sinal SIGKILL nunca é propagado para os processos filhos de um processo, portanto,sleep
nem é morto;nohup
inicia um processo imune aos sinais SIGHUP, que é algo diferente; impedirá que o processo seja interrompido com a recepção de um sinal SIGHUP, que nesse caso pode ser recebido pelabash
instância de logon interativo, caso ahuponexit
opção tenha sido definida e o shell seja encerrado; portanto, tecnicamente, o usonohup
para iniciar um processo em umabash
instância de logon interativo com ahuponexit
opção desabilitada impedirá que o processo seja interrompido na recepção de um sinal SIGHUP, mas sair / sair do shell não será SIGHUP independentemente;No entanto, em geral, quando
nohup
é necessário para impedir que sinais SIGHUP sejam provenientes do shell pai, não há motivo para preferir okill -9
método on parent ao métodonohup
on child; em vez disso, deve ser o oposto.Matar o pai usando o
kill -9
método não deixa uma chance de o pai sair normalmente, enquanto iniciar o filho usando onohup
método permite que o pai seja encerrado por outros sinais, como SIGHUP (para fazer um exemplo que faz sentido no contexto de uma criança começou a usarnohup
), o que permite que ela saia normalmente.fonte
ps -e | grep process
deve listar os processos junto com o PID (ou melhor, apenaspgrep -x process
se tiver certeza de que coincide com esse processo único e não com coisas não esperadas); o problema é que quando você mata um processo comkill -9
as suas crianças se possuído porupstart
, daí seu PPID original é perdido e seu PPID muda para arrivista do PID, tornando-os irreconhecíveis (AFAIK), mas para o seu nome ou PIDnohup
falhará para impedir que um processo seja interrompido ao receber um sinal SIGHUP do processo pai? Eu estou tentando executar um processo em segundo plano (em um terminal shell PuTTY SSH) pornohup <command> <arg> &
. Quando eu sair, clicando noX
botão PuTTY , o processo em segundo plano será encerrado imediatamente. Quando eu sair do sistema digitandoexit
o terminal shell PuTTY SSH, o processo continuará sendo executado em segundo plano.bash
por padrão , não envia o sinal HUP para processos filho ao sair . Mais detalhadamente (obrigado @kos), ele nunca faz isso para shells que não são de login .Você pode configurar o bash para fazer isso para shells de login, se definir a opção
huponexit
. Em um terminal, faça:(isso inicia um novo shell de "login")
Agora verifique o
sleep
processo:... não está em execução: recebeu o sinal HUP e saiu conforme solicitado.
fonte
sleep 1000 & ; exit
ossleep
sobrevive? Aviso que, se eukill -HUP
osleep
processo que vai sair. E mesmo quehuponexit
definido, osleep
sobrevive. Confuso ... (Vou tentar entender melhor e modificar o asnwer, caso contrário, vou excluí-lo).kill -9
realmente não é o caminho que se deve seguir. É como atirar com uma arma na TV para desligá-la. Além do componente cômico, não há vantagem. Os processos não podem pegar ou ignorarSIGKILL
. Se você não der ao processo a chance de concluir o que está fazendo e limpar, ele poderá deixar arquivos corrompidos (ou outro estado) por aí e não poderá ser iniciado novamente.kill -9
é a última esperança, quando nada mais funciona.O que acontece no seu caso:
O processo pai de
sleep
é obash
shell atualmente em execução . Quando você fazkill -9
o bash, o processo do bash não tem a chance de enviar umSIGHUP
a nenhum dos processos filhos, porqueSIGKILL
(o que é enviado porkill -9
) não pode ser capturado pelo processo. O processo de suspensão continua em execução. o sono agora se tornou um processo órfão .O processo init (PID 1) executa um mecanismo chamado reparenting. Isso significa que o processo init agora se torna o pai desse processo órfão. init é uma exceção, os processos podem se tornar filhos, pois coletam processos que perderam o processo pai original. Btw: Um daemon (como
sshd
) faz isso quando "está em segundo plano".Se isso não acontecesse, o processo órfão mais tarde (quando terminado) se tornaria um processo de zumbi. É o que acontece quando
waitpid()
não é chamado (uma responsabilidade do processo pai que não pode ser concluída quando o processo foi interrompido). O init chamawaitpid()
em um intervalo específico para evitar filhos zumbis.fonte
TERM
ouHUP
huponext
. E TERM irá esperar até que o sono termine. No caso do comando PO sono, seria milhares de anos =)O
&
inicia o processo em segundo plano. Se você digitarps -ef
, verá que o ID do processo pai (PPID) do seu sono é a sua festa. Então saia e entre novamente. O processo permanecerá em execução após o logout. Após o login pela segunda vez, você executaps -ef
novamente. Você verá que agora o pai do seu processo de suspensão será processado com o ID "1". Isso é init, o pai de todos os processos.fonte
O uso
&
fará com que o programa seja executado como plano de fundo. Para ver o programa em segundo plano, use obg
comando e para executá-lo como primeiro plano novamente, executefg
.Sim, existem várias maneiras de manter o programa em execução até o terminal principal encerrado.
fonte
huponexit
funciona apenas em shells de login, como uma concha obtido viassh
(e não, digamos, em uma concha obtido viagnome-terminal
)