Ps çıkışını başlıklarla grep


26

PS çıkışını başlıklar yerinde olduğunda nasıl yakalayabilirim?

Bu iki işlem sunucumda çalışan bir uygulamayı oluşturuyor ....

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

yok 6-22:01:17o 6 gün çalıştıktan gösterdiği anlamına gelir? Sürecin ne kadar süredir çalıştığını belirlemeye çalışıyorum ...

2. sütun işlem kimliği midir? Öyleyse kill 32017, 2. süreci öldürür mü?

Yanıtlar:


37
ps -ef | egrep "GMC|PID"

"GMC" yi değiştirin ve psgereken şekilde değiştirin.

Örnek çıktı:

root@xxxxx:~$ ps -ef | egrep "disk|PID"

UID        PID  PPID  C STIME TTY          TIME CMD
paremh1  12501 12466  0 18:31 pts/1    00:00:00 egrep disk|PID
root     14936     1  0 Apr26 ?        00:02:11 /usr/lib/udisks/udisks-daemon
root     14937 14936  0 Apr26 ?        00:00:03 udisks-daemon: not polling any devices

8
Bu neden işe yarıyorsa 'neden' hakkında biraz bilgi eklemek iyi olurdu.
Elijah Lynn

2
Hayır, bu kullanıcı için bir egzersiz.
Hyppy

@ElijahLynn Başlıktaki metinle eşleşiyor - bu durumda, PID. Ama UID, PTIME veya başlığındaki başka herhangi bir şeyle değiştirebilirsin ...
Ben Creasy

5
Böylece ps -etüm işlemleri seçer ps -fve sütun başlıklarını gösteren tam formatlı bir listedir. Sonra sütun başlıklarını ve çıktısını grep uzatılmış olan ve borunun |özel bir anlamı olan OR (bu VEYA) olan egrep'e göndeririz . Böylece, sütun başlıklarındaki PID ile artı önemli olan çıktı satırlarını eşleştirebilirsiniz.
Elijah Lynn

Ubuntu 16.04'deki egrep / grep -E komutunda basit tırnak işaretlerini kullanmak zorunda kaldım, örneğin: ps -ef | grep -E 'GMC|PID'
Vlax

13

Geekosaur sayesinde, bu komutu ayrı bir komut yerine talepleriniz için kullanmak istiyorum:

ps -ef | head -1; ps -ef | grep "your-pattern-goes-here"

İşin zor yanı ";" komutu zincirlemek için kabuk tarafından desteklenir.


bu, kabul edilen cevaptan daha temiz ve daha sağlam. Başlığın içinde PID olduğu ve grep dizesine karmaşıklık eklemediği iddiası yoktur.
7yl4r

2
oh bekle ... ps -eftekrarladın. daha da iyisips -ef | { head -1 ; grep "your-pattern" ; }
7yl4r

@ 7yl4r asla bu kabuk yeteneğini kullanmadı. Gelişmiş komutunu denedim, mükemmel çalışıyor! Öğrenildim, :)
Vic Lau

3
Başkalarının merak için 'Gruplama Komutları' olarak adlandırılan bu teknik, yaklaşık Bulunan açıklama, bkz: gnu.org/software/bash/manual/html_node/Command-Grouping.html
Vic Lau

@ 7yl4r harika bir teknik! Komutu nasıl tekrarlayamayacağımı düşünüyordum. Gruplandırılmış komut bile borulu olabilir: ps -ef | { head -1; grep "pattern" | head -5; }. Grep-ed modelinin çok fazla sonucu varsa kullanışlıdır!
bağımlı

6

İkinci sütun, işlem kimliğidir; Dördüncüsü, sürecin yaratıldığı zamandır (bu genellikle programınızın başladığı zamandır, ancak her zaman değil; düşünün execve()ve arkadaşlar); 6, tüketilen CPU zamanıdır. Bu yüzden 8 gündür çalışıyor ve endişe verici olduğunu düşündüğüm neredeyse 7 gün CPU kullanıyordu.

Üstbilgiyi aynı sorgulamaya sokmak en iyi yanıdır; Sadece ayrı yaparım ps | head -1. Başlıkları geçmek için tasarlanmamış, pskendi seçim yöntemlerini veya pgreponun yerine bir şeyi kullanmayı düşünebilirsiniz grep.


Nedir 83?
Webnet

Geçmiş CPU ve I / O kullanımına ve kullanıcı veya sistem tarafından atanan nicedeğere dayanan mevcut işlem önceliği . Küçük sayılar daha yüksek önceliğe sahiptir. Bu durumda grepöncelik 0'dır, çünkü diskte bloke edilmiştir, çıktısını yazmak için okur ve üretilir ve PNetTNetServer.binbüyük bir sayıdır, çünkü zaman dilimi engellemeden sürekli olarak kullanır. (Çizelgeleme karmaşıktır ve ayrıntılar kullanılan kesin çizelgeye bağlı olacaktır.)
geekosaur

5

Egrep çözümü basit ve kullanışlıdır, fakat elbette her zaman 'PID' (başlı başına bir varsayımdan çok daha fazlası) içeren başlığa ve başka bir yerde bulunmayan aynı dizgeye bağlıdır. Bunun ihtiyaçlarınız için yeterli olduğunu tahmin ediyorum, ancak birinin alternatif istemesi durumunda sed vardır.

Sed, "ilk satırı sonra deseni içeren herhangi bir satırı yazdır" demenizi sağlar. Örneğin:

ps auxwww | sed -n '1p; /PROCESS_NAME_TO_SEARCH/p;'

Ekleme /sed -n/d;filtresine kendini sed:

ps auxwww | sed -n '1p; /sed -n/d; /PROCESS_NAME_TO_SEARCH/p;'

/sed -n/ddoğru değil. sed -nYazdırmak istediğiniz bazı mevcut komutlar olabilir . Hile kullanmaktır sed -n '1p; /[P]ROCESS_NAME_TO_SEARCH/p'. ;-) []Arama dizesindeki herhangi bir karakterin etrafına dikkat edin.
anishsane

4

daha kolay alternatif: ps -ef | { head -1; grep GMC; }

sayıyı başlığınızın görüntülendiği satır sayısıyla değiştirin.


1
Bu yaklaşımı seviyorum ama komutun sonunda başka bir noktalı virgül gerekiyor. ps -ef | { head -1; grep GMC; }. Ayrıca aşağıdaki gibi bir işlevde seviyorum:function pgrep() { ps -ef | { head -1; grep $@; } }
Brett

1

pgrep ile pid alabilirsiniz

pgrep PNetTNetServer

ve sonra ps'i ps ile kullanın

ps u 12345

hatta ikisini tek bir komutta birleştirin

ps u `pgrep PNetTNetServer`

Bu sadece istediğiniz satırı gösterir ve başlığı içerir.


0

Basacak küçük bir Perl programı yazdım

  • Herhangi bir eşleşme varsa, ilk satır ve eşleşen tüm satırlar veya
  • hiçbir şey, eğer kibrit yoksa.

Sıklıkla olduğu gibi kullanıyorum ps | 1andre GMC, ancak dosya argümanları da alabilir (her dosya, o dosyadan gelen satırlarda yapılan eşleşmeler için kendi başlık satırını sağlar).



#!/usr/bin/perl

#
# 1andre <regexp> [<file> ...]
#
#   1 -           first ({1}st)
# and -                  {and}
#  re - (lines matching) {re}gexp
#
# If no <files> are given (or "-" is given as a <file>) stdin is
# used.
#
# If any lines from each <file> match the <regexp>, print the
# first line from that <file> and all the matching lines from
# that <file>.
#

use strict;
use warnings;

if(scalar @ARGV < 1) {
  printf STDERR "usage: %s <regexp> [<file> ...]\n", $0;
  exit 1;
}

my $re = shift;
my $header;

while(<>) {
  if($. == 1) {
    $header = $_;
  } elsif(m/$re/) {
    if(defined $header) {
      print $header;
      undef $header;
    }
    print;
  }
} continue {
  # close resets $. when we get to the end of each file that <> is processing
  close ARGV if eof;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.