Processos em segundo plano são atualizados para o processo pai (geralmente no Linux) init
, PID 1
.
obviously the & is for run it on background. The question is why it keep running if it was launched by root but root is no longer active?
root
está ativo, desde que seu sistema esteja funcionando. ( root
como em o superusuário.)
De qualquer forma, isso não tem nada a ver com o usuário root
em si. Como
o processo que você iniciou não depende do terminal (ou algo parecido),
terminar o processo pai não terminaria o filho. Geralmente fica órfão por um curto período de tempo e adotado por init
.
Muitos dos seus processos são executados em outras contas. Tente, por exemplo:
ps aux | awk 'NR>1{print $1}' | sort -u
Para ilustrar, pode-se usar outra conta, por ex. testuser
.
sleeplong
:
#!/bin/sh
sleep 9999
Salvar e cmod +x sleeplong
. Executar sob testuser
:
user@host $ su testuser
testuser@host $ ./sleeplong &
[1] 9692
Abra top
com PIDs:
user@host $ pids="$(pstree -cpsa 9692 | \
sed 's/ *[^,]*,\([0-9]*\).*//' | tr '\n' ',')"; \
top -w 90 -p ${pids}1
Digite V para obter a árvore
PID USER TIME+ COMMAND
1 root 0:01.03 init
19787 user 95:30.58 '- terminal
8835 user 0:00.16 '- bash
9634 testuser 0:00.04 '- su
9642 testuser 0:00.09 '- bash
9692 testuser 0:00.00 '- sleeplong
9693 testuser 0:00.00 '- sleep
Sair:
testuser@host $ exit
Execute a rotina principal novamente:
PID USER TIME+ COMMAND
1 root 0:01.03 init
9692 testuser 0:00.00 '- sleeplong
9693 testuser 0:00.00 '- sleep
Você pode visualizar isso mais ao fazer algo assim:
-
Expanda o script para:
#!/bin/sh sleep 8888 & sleep 9999 ecode=$? printf "Bye\n" exit $ecode
-
Execute
./sleeplong2 &
(su
ou não). - Inicie o
top
com a mesma rotina acima e digite c para mostrar os argumentos. -
No outro terminal:
kill NNN # Where NNN=PID of sleep 8888 kill NNN # Where NNN=PID of sleep 9999
O código de saída do último kill
deve normalmente ser 143
. Isso é
128 + 15 = 143
Como kill
é padronizado para 15 ou SIGTERM
.
Outra coisa para experimentar pode ser matar bash (ou similar), onde sleep
residir.
Além disso, você não pode fazer isso, por exemplo:
$ su testuser -c './sleeplong &'
Espero que tenha ficado um pouco mais claro.