2012-07-18 30 views

Respuesta

12

Para obtener el PID del script bash puede usar la variable $$.

Entonces, para obtener sus hijos, puede ejecutar:

bash_pid=$$ 
children=`ps -eo ppid | grep -w $bash_pid` 

ps devolverá la lista de los PID de los padres. Luego, grep filtra todos los procesos no relacionados con los hijos del script bash. Con el fin de obtener el número de niños que puede hacer:

num_children=`echo $children | wc -w` 

En realidad el número que obtendrá será apagado por 1, ya que ps habrá un niño de la escritura del golpe también. Si no desea contar la ejecución de ps como un niño, a continuación, puedes arreglar eso con:

let num_children=num_children-1 

ACTUALIZACIÓN: Con el fin de evitar llamar grep, la siguiente sintaxis podría utilizarse (si es compatible por la versión instalada de ps):

num_children=`ps --no-headers -o pid --ppid=$$ | wc -w` 
+3

'grep -w $ bash_pid' en caso de que bash pid sea una subcadena del ID del proceso del niño. – chepner

+0

@chepner ¡Buen punto! Voy a arreglar eso. ¡Gracias! :) – betabandido

+0

No estoy seguro, pero creo que el proceso adicional es la subshell que contiene la tubería ps/grep.Simplemente siendo pedantes :) – chepner

2

uso ps con la opción para seleccionar --ppid hijos del proceso de golpe de corriente.

bash_pid=$$ 
child_count=$(ps -o pid= --ppid $bash_id | wc -l) 
let child_count-=1 # If you don't want to count the subshell that computed the answer 

(Nota: esto requiere la versión Linux de ps para --ppid No sé si hay un equivalente para BSD ps o no..)

+0

No funciona para mí. Me da una opción 'ps: ilegal - -'. ¿Quizás estás asumiendo una versión particular de ps? – ghoti

+0

Sí, asumí la versión utilizada por Linux. – chepner

+0

Ah. Probé en FreeBSD y OSX. – ghoti

-2

Es posible evaluar los trabajos cáscara orden interna como :

counter = `jobs | wc -l` 
+1

Eso cuenta trabajos, no procesos. Un trabajo puede consistir en múltiples procesos. – chepner

+1

No hay espacios alrededor del signo igual. Use '$()' en lugar de backticks. –

4

también puede utilizar pgrep:

child_count=$(($(pgrep --parent $$ | wc -l) - 1))

Use pgrep --parent $$ para obtener una lista de los elementos secundarios del proceso bash.
A continuación, utilice wc -l en la salida para obtener el número de líneas: $(pgrep --parent $$ | wc -l) Luego restar 1 (wc -l informes 1 incluso cuando pgrep --parent $$ está vacía)

3

Prefiero:

num_children=$(pgrep -c -P$$)

Desova sólo una proceso, no tiene que contar palabras o ajustar los números de PID por los programas en la tubería.

Ejemplo:

~ $ echo $(pgrep -c -P$$) 
0 
~ $ sleep 20 & 
[1] 26114 
~ $ echo $(pgrep -c -P$$) 
1 
Cuestiones relacionadas