Você pode usar sh -c
e exec
obter o PID do comando antes mesmo de ele ser executado.
Para começar myCommand
, para que seu PID seja impresso antes de começar a ser executado, você pode usar:
sh -c 'echo $$; exec myCommand'
Como funciona:
Isso inicia um novo shell, imprime o PID desse shell e, em seguida, usa o exec
built-in para substituir o shell pelo seu comando, garantindo que ele tenha o mesmo PID. Quando seu shell executa um comando com o exec
built-in, seu shell está realmente se tornando esse comando , em vez do comportamento mais comum de criar uma nova cópia de si mesmo, que possui seu próprio PID separado e que se torna o comando.
Acho que isso é muito mais simples do que as alternativas que envolvem execução assíncrona (com &
), controle de tarefas ou pesquisa com ps
. Essas abordagens são boas, mas, a menos que você tenha um motivo específico para usá-las - por exemplo, talvez o comando já esteja em execução; nesse caso, procurar por seu PID ou usar o controle de tarefas faria sentido - sugiro considerar isso primeiro. (E eu certamente não consideraria escrever um script complexo ou outro programa para conseguir isso).
Esta resposta inclui um exemplo dessa técnica.
Partes desse comando podem ocasionalmente ser omitidas, mas não geralmente.
Mesmo que o shell que você está usando seja do estilo Bourne e, portanto, ofereça suporte ao exec
incorporado com essas semânticas, geralmente você não deve evitar o uso sh -c
(ou equivalente) para criar um novo processo de shell separado para esse fim, porque:
- Depois que o shell se torna
myCommand
, não há shell esperando para executar comandos subseqüentes. sh -c 'echo $$; exec myCommand; foo
não seria capaz de tentar executar foo
depois de se substituir por myCommand
. A menos que você esteja escrevendo um script que execute isso como seu último comando, você não pode simplesmente usar echo $$; exec myCommand
em um shell em que esteja executando outros comandos.
- Você não pode usar um subshell para isso.
(echo $$; exec myCommand)
pode ser sintaticamente melhor do que sh -c 'echo $$; exec myCommand'
, mas quando você executa o $$
interior (
)
, ele fornece o PID do shell pai, não do subshell em si. Mas é o PID do subshell que será o PID do novo comando. Alguns shells fornecem seus próprios mecanismos não portáteis para localizar o PID do subshell, que você pode usar para isso. Em particular, no Bash 4 , (echo $BASHPID; exec myCommand)
funciona.
Por fim, observe que alguns shells executam uma otimização onde executam um comando como se fossem exec
(ou seja, renunciam primeiro à bifurcação) quando se sabe que o shell não precisará fazer nada posteriormente. Alguns shells tentam fazer isso a qualquer momento, sendo o último comando a ser executado, enquanto outros o fazem apenas quando não há outros comandos antes ou depois do comando, e outros não o fazem. O efeito é que, se você esquecer de escrever exec
e usar sh -c 'echo $$; myCommand'
, ele às vezes fornecerá o PID correto em alguns sistemas com alguns shells. Eu recomendo que nunca confie em tal comportamento e, em vez disso, sempre inclua exec
quando é isso que você precisa.