Substituição de comando. O nome do processo gerado é idêntico ao nome pai

1

Este script

$ cat csub.sh 
#!/bin/bash

while true;
do 
  sleep 5
  AVAR=$(date; sleep 2)
done 

quando iniciado, faz um processo aparecer na saída do ps:

ps -eLf|egrep '[c]sub.sh|PID'
UID        PID  PPID   LWP  C NLWP STIME TTY          TIME CMD
jimmy    31364 23445 31364  0    1 00:33 pts/7    00:00:00 /bin/bash ./csub.sh

que é bastante previsível bem como o fato de que $(date; sleep 2) gera outro processo

Surpreendente é que o processo gerado tem CMD idêntico exibido

UID        PID  PPID   LWP  C NLWP STIME TTY          TIME CMD
jimmy    31364 23445 31364  0    1 00:33 pts/7    00:00:00 /bin/bash ./csub.sh
jimmy    31433 31364 31433  0    1 00:33 pts/7    00:00:00 /bin/bash ./csub.sh

Eu adicionei o sleep para poder capturar o processo na saída do ps, caso contrário, é muito menos provável, porque é muito curto. Como você vê o processo gerado 31433 tem 31364 como seu pai. Espero que o processo gerado tenha algum CMD diferente mencionando com o que lida, por exemplo, data ou comando sleep. Para casos em que há várias substituições de comandos, como eu poderia distingui-las quando vejo um processo gerado aparecer?

    
por Tagwint 07.05.2016 / 23:57

1 resposta

2

Na página de manual, seção 2, para fork() :

fork() creates a new process by duplicating the calling process. The new process, referred to as the child, is an exact duplicate of the calling process, referred to as the parent, except for the following points:

  • The child has its own unique process ID, and this PID does not match the ID of any existing process group (setpgid(2)).
  • The child's parent process ID is the same as the parent's process ID.
  • The child does not inherit its parent's memory locks (mlock(2), mlockall(2)).
  • Process resource utilizations (getrusage(2)) and CPU time counters (times(2)) are reset to zero in the child.
  • The child's set of pending signals is initially empty (sigpending(2)).
  • The child does not inherit semaphore adjustments from its parent (semop(2)).
  • The child does not inherit record locks from its parent (fcntl(2)).
  • The child does not inherit timers from its parent (setitimer(2), alarm(2), timer_create(2)).
  • The child does not inherit outstanding asynchronous I/O operations from its parent (aio_read(3), aio_write(3)), nor does it inherit any asynchronous I/O contexts from its parent (see io_setup(2)).

Não está nesta lista a linha de comando de invocação do processo, de modo que será idêntico ao seu pai. Você pode distinguir as crianças de seus pais, porque o PPID (Parent PID) da criança será o PID do processo de origem.

    
por 08.05.2016 / 00:41