Puede usar sh -c
y exec
para obtener el PID del comando incluso antes de que se ejecute.
Para comenzar myCommand
, para que su PID se imprima antes de que comience a ejecutarse, puede usar:
sh -c 'echo $$; exec myCommand'
Cómo funciona:
Esto inicia un nuevo shell, imprime el PID de ese shell y luego usa el exec
incorporado para reemplazar el shell con su comando, asegurando que tenga el mismo PID. Cuando su shell ejecuta un comando con el exec
builtin incorporado, en realidad se está convirtiendo en ese comando , en lugar del comportamiento más común de bifurcar una nueva copia de sí mismo, que tiene su propio PID separado y que luego se convierte en el comando.
Considero que esto es mucho más simple que las alternativas que involucran ejecución asincrónica (con &
), control de trabajo o búsqueda con ps
. Esos enfoques están bien, pero a menos que tenga una razón específica para usarlos, por ejemplo, tal vez el comando ya se esté ejecutando, en cuyo caso buscar su PID o usar el control de trabajo tendría sentido, sugiero que considere esto primero. (Y ciertamente no consideraría escribir un script complejo u otro programa para lograr esto).
Esta respuesta incluye un ejemplo de esta técnica.
Algunas partes de ese comando podrían omitirse ocasionalmente, pero generalmente no.
Incluso si el shell que está utilizando es de estilo Bourne y, por lo tanto, es compatible exec
con esta semántica, generalmente no debe intentar evitar el uso sh -c
(o equivalente) para crear un nuevo proceso de shell separado para este propósito, porque:
- Una vez que el shell se ha convertido
myCommand
, no hay ningún shell esperando para ejecutar comandos posteriores. sh -c 'echo $$; exec myCommand; foo
no podría intentar ejecutarse foo
después de reemplazarse por sí mismo myCommand
. A menos que esté escribiendo un script que ejecute esto como su último comando, no puede simplemente usarlo echo $$; exec myCommand
en un shell donde está ejecutando otros comandos.
- No puede usar una subshell para esto.
(echo $$; exec myCommand)
puede ser sintácticamente mejor que sh -c 'echo $$; exec myCommand'
, pero cuando se ejecuta en el $$
interior (
)
, proporciona el PID del shell principal, no del subshell en sí. Pero es el PID del subshell el que será el PID del nuevo comando. Algunos shells proporcionan sus propios mecanismos no portátiles para encontrar el PID del subshell, que puede usar para esto. En particular, en Bash 4 , (echo $BASHPID; exec myCommand)
funciona.
Finalmente, tenga en cuenta que algunos shells realizarán una optimización donde ejecutan un comando como si exec
(es decir, renunciaran a bifurcar primero) cuando se sabe que el shell no necesitará hacer nada después. Algunos shells intentan hacer esto cada vez que es el último comando que se ejecuta, mientras que otros solo lo hacen cuando no hay otros comandos antes o después del comando, y otros no lo hacen en absoluto. El efecto es que si olvida escribir exec
y simplemente usa sh -c 'echo $$; myCommand'
, a veces le dará el PID correcto en algunos sistemas con algunos shells. Recomiendo no depender nunca de ese comportamiento y, en su lugar, siempre incluir exec
cuándo es lo que necesita.