$$
é o PID do shell atual . Quando você usa $$ no corpo do script bash -c
, obtém o pid de esse shell gerado
$ echo $$; bash -c 'echo $$'; echo $$
6872
6987
6872
$!
é o PID do último processo em segundo plano
$ sleep 5 & echo $!; sleep 5 & echo $!; echo ===; pgrep -l sleep
[1] 7118
7118
[2] 7119
7119
===
7118 sleep
7119 sleep
Quando você faz bash -c 'echo $$' & echo $!
, você obtém o mesmo pid impresso duas vezes porque, para o seu shell atual, $! é o pid do processo bash em segundo plano e, dentro do corpo do script, $$ é o pid atual do mesmo processo bash em segundo plano.
Quando você faz /bin/bash -c 'echo $$ && exec sleep 5 & echo $!'
, obtém dois pids diferentes: $$ é o pid do processo bash e $! é o pid do processo do sono.
- Eu acho isso estranho porque você está usando
exec
, então deve ser o mesmo PID (o processo de suspensão substituindo o processo bash) - No entanto, você está usando
exec ... &
então o bash deve primeiro criar um subshell para executar a tarefa em segundo plano e, em seguida, o exec substitui essa subshell pelo sleep.
A resposta para a sua pergunta real é melhor respondida por uma pessoa php, o que eu não sou. Você deve sinalizar essa pergunta para um moderador e solicitar que ele seja movido para o Stack Overflow, onde mais pessoas do php podem sair.