Comment puis-je grep la sortie PS avec les en-têtes en place?
Ces deux processus constituent une application en cours d'exécution sur mon serveur ....
root 17123 16727 0 16:25 pts/6 00:00:00 grep GMC
root 32017 1 83 May03 ? 6-22:01:17 /scripts/GMC/PNetT-5.1-SP1/PNetTNetServer.bin -tempdir /usr/local/GMC/PNetT-5.1-SP1/tmpData -D
ne 6-22:01:17
signifie pas qu'il est en cours depuis 6 jours? Je cherche à déterminer la durée de la durée du processus ...
La 2e colonne est-elle l'ID du processus? Donc, si je le fais, kill 32017
cela tuera le 2ème processus?
ps -e
Sélectionne donc tous les processus, etps -f
est une liste au format complet qui montre les en-têtes de colonne. Ensuite, nous dirigeons les en-têtes de colonne et la sortie vers egrep, qui est grep étendu et permet au tuyau|
d'avoir une signification spéciale, qui est OU (ce OU cela). Vous finissez donc par faire correspondre le PID dans les en-têtes de colonne et les lignes de sortie qui comptent.ps -ef | grep -E 'GMC|PID'
Grâce à geekosaur, je voudrais utiliser cette commande pour vos demandes, plutôt qu'une commande séparée:
L'astuce consiste à utiliser le ";" pris en charge par le shell pour chaîner la commande.
la source
ps -ef
répété. encore mieux estps -ef | { head -1 ; grep "your-pattern" ; }
ps -ef | { head -1; grep "pattern" | head -5; }
. Utile si le motif grep-ed a beaucoup de résultats!La deuxième colonne est l'ID du processus; 4ème, c'est quand le processus a été créé (c'est généralement l'heure à laquelle votre programme a commencé, mais pas toujours; réfléchissez
execve()
et amis); 6e est la quantité de temps CPU consommée. Il fonctionne donc depuis 8 jours et utilise près de 7 jours de temps processeur, ce que je considérerais comme inquiétant.Obtenir l'en-tête dans la même invocation est au mieux délicat; Je ferais juste un séparé
ps | head -1
. Vous pourriez envisager d'utiliserps
les propres méthodes de sélection ou quelque chose commepgrep
au lieu degrep
, qui n'est pas vraiment conçu pour passer les en-têtes.la source
83
?nice
valeur affectée par l'utilisateur ou le système . Les petits nombres ont une priorité plus élevée. Dans ce cas, lagrep
priorité est 0 car elle a été bloquée lors des lectures de disque et a donné lieu à l'écriture de sa sortie, etPNetTNetServer.bin
est un grand nombre car elle utilise régulièrement sa tranche de temps sans blocage. (L'ordonnancement est complexe et les détails dépendront de l'ordonnanceur exact utilisé.)La solution egrep est simple et utile, mais bien sûr, vous dépendez de l'en-tête contenant toujours «PID» (une hypothèse plus que raisonnable, cependant) et la même chaîne ne se produisant pas ailleurs. Je suppose que cela suffit pour vos besoins, mais au cas où quelqu'un voudrait une alternative, il y a sed.
Sed vous permet simplement de dire "imprimer la première ligne, puis toute ligne contenant le motif". Par exemple:
Ajouter
/sed -n/d;
au filtre se séduit:la source
/sed -n/d
ce n'est pas correct. Certaines commandes existantes peuvent avoirsed -n
, que vous vouliez imprimer. L'astuce est d'utilisersed -n '1p; /[P]ROCESS_NAME_TO_SEARCH/p'
. ;-) Notez[]
autour de n'importe quel caractère dans la chaîne de recherche.alternative plus simple:
ps -ef | { head -1; grep GMC; }
remplacez le nombre par le nombre de lignes sur lesquelles votre en-tête est affiché.
la source
ps -ef | { head -1; grep GMC; }
. Je l'aime aussi dans une fonction comme la suivante:function pgrep() { ps -ef | { head -1; grep $@; } }
vous pourriez obtenir le pid avec pgrep
puis utilisez ps avec le pid
ou même combiner les deux en une seule commande
Cela montrerait juste la ligne que vous voulez et inclurait l'en-tête.
la source
J'ai écrit un petit programme Perl qui imprimera
Je l'utilise le plus souvent comme
ps | 1andre GMC
, mais il peut également prendre des arguments de fichier (chaque fichier fournit sa propre ligne d'en-tête pour les correspondances faites sur les lignes de ce fichier).la source