2010-09-24 6 views
3

J'ai besoin, pour un script python que je crée, d'obtenir juste le PID d'un processus (basé sur son nom), puis pour obtenir de ce processus, usings son PID, sa durée, qui, de l'impression ci-dessous, serait « 00:00:00 »Linux/Bash en utilisant PS -f pour des retours PID spécifiques dans un format différent de PS -f, aussi queston sur l'utilisation de Grep pour analyser cela

root  5686  1 0 Sep23 ?  00:00:00 process-name 

Je suis en utilisant cela pour obtenir juste le PID, par le nom du processus:

ps -ef |grep `whoami`| grep process-name | cut -c10-15 

donc, cela fonctionne très bien et je suppose que les paramètres de coupe (-c10-15) fonctionnerait universellement comme le placement du PID ne devrait pas changer (je l'ai juste obtenu d'un extrait que j'ai trouvé)

Cependant, quand j'essaye de faire quelque chose de semblable pour obtenir juste la valeur de TEMPS, comme ceci il le renvoie différemment

ps -f 5686 

retours:

root  5686  1 0 Sep23 ?  S  0:00 /path/to/process 

Alors, quand je tente une coupe, comme ci-dessous, je ne pense pas que cela fonctionnerait bien que je ne suis pas sûr de l'espacement sur ce retour est cohérent et aussi son montrant la valeur de temps différemment qu'auparavant (pas l'original "00:00:00" s tyle d'impression.

ps -f 5686 | cut -c40-47 

J'utilise dans mon script python pour enregistrer le PID d'un type de processus spécifique (par nom) afin que je puisse fermer plus tard sur cette instance du progra en cas de besoin. Des conseils sur ce que je peux faire pour corriger mon approche est appréciée

Répondre

3

Utilisez l'option -o pour contrôler quelles données sont sorties et dans quel ordre.

par exemple.

$ ps -o pid,time,comm 
    PID  TIME COMMAND 
3029 00:00:01 zsh 
22046 00:00:00 ps 

ou

$ ps -o pid,time,comm --no-headers 
3029 00:00:01 zsh 
22046 00:00:00 ps 

Ce sera plus facile à analyser. Je suggère d'analyser la sortie avec python en utilisant (pid, time, cmd) = result.split(2)

Vous pouvez également utiliser la commande pgrep pour lister uniquement les processus qui correspondent à des critères donnés.

+0

Merci, j'ai vu un article quelque part qui mentionnait quelque chose comme ceci, mais je ne pouvais pas le comprendre à partir de la sortie ps -help, j'ai trouvé la page de manuel tout de suite et je l'ai vu, j'aurais dû le faire en premier – Rick

+0

Comment puis-je obtenir ps -o pour un PID spécifique, J'essaye 'ps -o 8783 pid, le temps, comm' (essayant avec un PID je sais existe) mais son ne fonctionne pas, merci pour l'aide dans ceci – Rick

+1

' ps -p 8783 -o pid, temps, comm' devrait fonctionner ; aussi essayer 'ps -C nom_commande -o pid, temps, comm' – Unreason

0

Qu'en est-il en utilisant

ps ux | awk '/$PROCESS_NAME/ && !/awk/ {print $2, $10}' 

Il devrait vous donner PID et TIME (adapté de here)

EDIT:
Version avec -ef

ps -ef | awk '/$PROCESS_NAME/ && !/awk/ {print $2, $7}' 
+0

J'utilise un appel Python pour faire ceci donc je veux d'abord juste obtenir le PID et puis faire défiler chaque PID, juste obtenir le temps pour que je puisse filtrer pour ceux qui sont les plus récents (peut gérer cette partie en Python), je pense que je peux adapter ce que vous avez posté pour ce faire, je suis juste en train de lutter avec cela car je ne sais pas muc h ligne de commande bash/linux au-delà des bases – Rick

+0

Peu importe python ou non, vous pouvez récupérer toutes les informations et les analyser ensuite en python; voir http://stackoverflow.com/questions/682446/splitting-out-the-output-of-ps-using-python (et aussi les raisons de ne pas utiliser une telle approche) – Unreason

0

Si vous voulez une représentation cohérente du temps CPU, lisez /proc/<pid>/stat et lisez les champs utime et stime.

Lire man 5 proc pour obtenir la mise en page complète de ce fichier, mais le bit facile est que vous avez besoin des 14e et 15e valeurs, et ils sont représentés en "jiffies" (généralement 100 par seconde), par exemple.

% ps -e 2398 
2398 ?  00:04:29 ypbind 

00:04:29 est de 269 secondes

% awk '{ print ($14 + $15)/100 }' < /proc/2398/stat 
269.26 

ou, dans un script Bash sans fraie un sous-processus:

#!/bin/sh 
read -a procstat /proc/pid/stat 
let cpu=(procstat[13] + procstat[14])/100 
Questions connexes