Qual é a diferença entre $$ e $! ao usar / bin / bash -c

2

Estou tentando entender o "oneliner" em comente por @sysfault:

/bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &

Eu tentei as seguintes variações ...

Diferentes $$ por dentro e por fora:

/bin/bash -c 'echo $$ && exec sleep 5' ; echo $$
14408
29700

Mesmos pid (mas no fundo):

$ /bin/bash -c 'echo $$ && exec sleep 5' & echo $! 
[1] 8309
8309
$ 8309

[ 1 ]+  Done  /bin/bash -c 'echo $$ && exec sleep 5'

Diferente pid por $$ & $! :

/bin/bash -c 'echo $$ && exec sleep 5 & echo $!'                                 
6504
6503

Kill não funcionou: / bin / bash -c 'echo $$ & & (dormir 15; eco feito) '
19063 Morto $ done (echo apareceu após o kill)

O mesmo pid com acesso ao pid do processo em primeiro plano:

$ /bin/bash -c 'echo > tmp.pid ; sleep 10 ; echo $$ ; echo done ; echo $$;'      
28415 (instantly)
28415 (10 seconds later)
done
28415
$ cat tmp.pid 
28415

Com este comando eu pude matar o pid em outra janela antes que o sono terminasse - impedindo que os últimos três echos acontecessem:

$ /bin/bash -c 'echo $$ ; sleep 30 ; echo $$ ; echo done ; echo $$;'               
23236
Killed

Contexto: Por fim, quero iniciar os processos bash via php exec () e aguardar o resultado antes de continuar e salvar o pid para que eu possa limpar caso o botão de cancelamento manual seja pressionado. Existem dois processos caros com os quais lidarei: um rsync e um git commit & empurrar.

Qual é a melhor maneira de obter com segurança o pid de um script bash de primeiro plano que inclua vários comandos (com; > | ou & &)?

    
por gotjosh 06.02.2018 / 20:46

1 resposta

4

$$ é 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.

    
por 06.02.2018 / 21:08

Tags