Bash: executa o comando independente do PID pai?

1

Executando este script test.sh :

#!/bin/bash
sleep 15 & sleep 2000

Em seguida, visualizando os processos em execução com $ ps auxfwww | grep -i [2]000 -B 10 , recebo os seguintes 11886 e 11887 PIDs:

user      7070  0.0  0.0   4504  1444 ?        Ss   Nov15   0:00          \_ /bin/sh /etc/xdg/xfce4/xinitrc -- /etc/X11/xinit/xserverrc
user      7081  0.0  0.0 324540 14064 ?        Sl   Nov15   0:00          |   \_ xfce4-session
user      7100  0.0  0.3 562128 62800 ?        Sl   Nov15   0:48          |       \_ tilix
user     23644  0.0  0.0  31132  6136 pts/11   Ss   14:32   0:00          |       |   \_ /bin/bash
user     11884  0.0  0.0  20024  3044 pts/11   S+   14:58   0:00          |       |   |   \_ /bin/bash ./test.sh
user     11886  0.0  0.0  14776   700 pts/11   S+   14:58   0:00          |       |   |       \_ sleep 15
user     11887  0.0  0.0  14776   704 pts/11   S+   14:58   0:00          |       |   |       \_ sleep 2000

É possível executar o comando sleep 2000 totalmente independente dos processos pai? Por exemplo:

user      7070  0.0  0.0   4504  1444 ?        Ss   Nov15   0:00          \_ /bin/sh /etc/xdg/xfce4/xinitrc -- /etc/X11/xinit/xserverrc
user      7081  0.0  0.0 324540 14064 ?        Sl   Nov15   0:00          |   \_ xfce4-session
user      7100  0.0  0.3 562128 62800 ?        Sl   Nov15   0:48          |   |   \_ tilix
user     23644  0.0  0.0  31132  6136 pts/11   Ss   14:32   0:00          |   |   |   \_ /bin/bash
user     11884  0.0  0.0  20024  3044 pts/11   S+   14:58   0:00          |   |   |   |   \_ /bin/bash ./test.sh
user     11886  0.0  0.0  14776   700 pts/11   S+   14:58   0:00          |   |   |   |       \_ sleep 15
user     XXXXX  0.0  0.0  XXXXX   XXX XXXXXX   S+   XX:XX   0:00          \_ sleep 2000
    
por user321517 18.11.2018 / 00:13

1 resposta

0

Sim, é possível.

O que você quer aqui é que o processo seja reparado. O Unix processará o processo para o PID 1 quando seus processos originais forem finalizados.

Portanto, tudo o que você precisa fazer é ter o pai original da sleep 2000 exit.

Você pode fazer isso iniciando o plano de fundo sleep 2000 de um subshell.

Algo como:

#!/bin/bash
sleep 15 &
( sleep 2000 & )
# do something else here, like:
sleep 1
echo "=== Listing 'sleep' process tree: ==="
ps auxfwww | grep -i [2]000 -B 10
echo "=== All done. ===
    
por 18.11.2018 / 00:21