2012-07-18 38 views
24

Estoy escribiendo un script para monitorear la CPU y el MEM de cualquier proceso dado. Para eso necesito enviar el nombre del proceso para ser monitoreado como un argumento de línea de comando. Por ejemplo.¿Cómo obtener el PID de un proceso dando el nombre del proceso en Mac OS X?

./monitorscript <pname> 

que necesito para obtener el pid del proceso en la secuencia de comandos para que pueda utilizar un ps -p <pid> interior.

¿Cómo obtengo el pid de un proceso dado su nombre de proceso?

Entiendo que puede haber múltiples procesos en el mismo nombre. Solo quiero sacar el primer proceso de esa lista.

+6

Si 'pgrep' está disponible a continuación, sólo se puede decir 'pgrep process_name'. [Esta publicación] (http://unix.stackexchange.com/questions/225/pgrep-and-pkill-alternatives-on-mac-os-x) habla sobre la disponibilidad de 'pgrep' en OSX –

Respuesta

47

La respuesta anterior era sobre todo correcto, sólo necesitaba algunos ajustes para los diferentes parámetros en Mac OSX.

ps -A | grep -m1 firefox | awk '{print $1}' 
+0

si la aplicación ejecuta este PID correcto de devolución, pero si esa aplicación en particular no se está ejecutando, devuelva un número que no sea correcto. Estoy en os x 10.9 – mohacs

+1

Si la aplicación no se está ejecutando, podría devolver el PID del proceso grep. Eche un vistazo a mi respuesta. – stepmuel

+0

Acaba de probarse como pidb adb, no apareció nada. trabajó para algún proceso aunque – anything

1

puede probar esta

pid=$(ps -o pid=,comm= | grep -m1 $procname | cut -d' ' -f1) 
+0

Pequeñas mejoras: para eliminar el ruta al proceso para que no tenga coincidencias accidentales y haga coincidir todos los procesos; use 'pid = $ (ps -ceo ...)'. –

+0

No recibo ninguna respuesta cuando escribí 'echo" $ (ps -ceo pid =, comm = | grep -m1 firefox | cut -d '' -f1) '' en terminal. Estoy haciendo algo mal ? – Pradep

+0

el resultado de grep es 'firefox-bin 777', 3 espacios, use' cut -d '' -f3' – jackjr300

2

Prueba con esto:

echo "$(ps -ceo pid=,comm= | awk '/firefox/ { print $1; exit }')" 

El comando ps produce una salida como ésta, con el PID en la primera columna y el nombre del ejecutable (sólo) en la segunda columna:

bookworm% ps -ceo pid=,comm= 
    1 launchd 
    10 kextd 
    11 UserEventAgent 
    12 mDNSResponder 
    13 opendirectoryd 
    14 notifyd 
    15 configd 

... que awk procesa, imprime la primera columna (pid) y sale después de la primera coincidencia.

4

Este es el comando más corto que podría encontrar que se encarga del trabajo:

ps -ax | awk '/[t]he_app_name/{print $1}' 

Poner entre paréntesis alrededor de la primera letra se detiene awk de encontrar el proceso en sí awk.

+0

¿Cómo funcionan los corchetes en esta solución? – Floris

+0

A partir de esta respuesta (http://unix.stackexchange.com/a/74186): "Al poner los corchetes alrededor de la letra y las comillas alrededor de la cadena, busca la expresión regular, que dice: Encuentre el carácter 'f' seguido de 'nord'. Pero ya que pones los corchetes en el patrón 'f' ahora está seguido por ']', entonces grep no aparecerá en la lista de resultados. ¡Aseado! " – phatmann

+0

Muy inteligente. Gracias por la explicación. – Floris

2

Esta solución coincide con el nombre de proceso de manera más estricta:

ps -Ac -o pid,comm | awk '/^ *[0-9]+ Dropbox$/ {print $1}' 

Esta solución tiene las siguientes ventajas:

  • no tiene en cuenta los argumentos de línea de comandos como tail -f ~/Dropbox
  • no tiene en cuenta los procesos dentro de un directorio como ~/Dropbox/foo.sh
  • ignora procesos con nombres como ~/DropboxUID.sh
16

Puede instalar pidof con Homebrew:

brew install pidof 
pidof <process_name> 
+0

Menos sofisticado; más útil. – Nate

+0

¡Esta es una solución realmente fácil! ¡Gracias por esto! –

+0

Aquí hay una buena fuente para pidof https://www.cyberciti.biz/faq/linux-pidof-command-examples-find-pid-of-program/ –

-2

¿Por qué no se ejecuta TOP y utiliza las opciones para ordenar por otros parámetros, aparte de la EPI? ¿Como el PID más usado de la CPU/MEM?

la parte superior de la CPU -o < --- ordena todos los procesos de uso de la CPU

+0

De eso no se trata la pregunta. – bergercookie

12

Puede utilizar el comando pgrep como en el siguiente ejemplo

$ pgrep Keychain\ Access 
44186 
+0

¡Esto es muy útil! ¡Gracias! –

Cuestiones relacionadas