En bash, tiene esta variable útil: $ BASHPID que siempre devuelve el PID del subshell actualmente en ejecución. ¿Cómo puedo obtener el PID de una subshell en ksh? Por ejemplo, vea el código a continuación:
#!/usr/bin/ksh93
echo "PID at start: $$"
function run_in_background {
echo "PID in run_in_background $$"
run_something &
echo "PID of backgrounded run_something: $!"
}
function run_something {
echo "*** PID in run_something: $$"
sleep 10;
}
run_in_background
echo "PID of run in background $!"
Esto genera lo siguiente:
PID at start: 5328
PID in run_in_background 5328
*** PID in run_something: 5328
PID of backgrounded run_something: 5329
PID of run in background 5329
Lo que quiero es que la línea comience con la ****
salida del PID del subshell, en el caso del ejemplo que sería 5329.
fuente
$(exec sh -c 'echo $PPID')
embargo, el comando simple inicialsh -c 'echo $PPID'
proporciona un tercer PID. Así que gracias por la solución. Aceptado.(sh -c 'echo $PPID')
para evitar crear una subshell. Contraste con(sh -c 'echo $PPID'; true)
. Esta optimización solo se activa si intenta acceder$BASHPID
como lo último antes de que salga la subshell, es decir, solo en los casos en que no pueda hacer nada con el valor. Entonces, en la práctica, puede reemplazar$BASHPID
con$(sh -c 'echo $PPID')
.sh -c 'echo $PPID'
.Puede lograr lo que desea, pero necesita poner run_something en un script separado. No estoy exactamente seguro de por qué, pero $$ no se vuelve a evaluar cuando se usa en una función en el mismo script que lo está llamando. Supongo que el valor de $$ se asigna una vez después de analizar el script y antes de ejecutarlo.
run_in_background.sh
run_something.sh
salida
fuente
fuente
if [[ ${!KSH_VERSION} = .sh.version ]]; then
(solo uno=
) yelif [[ -z ${BASHPID+_} ]]; then
(evite usar el implícito-n
entre corchetes dobles, el viejo pdksh no lo sabía).Siguiendo la respuesta de @Gilles que encontré al resolver otro problema que tenía, preparé un programa de prueba rápida que sustenta la teoría de que la respuesta correcta es:
Descubrí que hay momentos en
exec
que no es necesario, pero confirmó que usarlo es la única forma de obtener el pid correcto todo el tiempo en todos los shells que probé. Aquí está mi prueba:y su salida
Sustituir su shell favorito en el tinglado:
sh
,bash
,mksh
,ksh
, etc ...No entiendo por qué los casos 2 y 3 dan resultados diferentes, ni por qué los resultados para el caso 3 difieren entre los shells. Probé
bash
,ksh
ymksh
en Arch Linux Fwiw.fuente
fuente