“Ps” kendi sürecini raporlamayı nasıl önleyebilir?


52
$ ps | grep django
28006 ttys004    0:01.12 /usr/bin/python bin/django celeryd --beat
51393 ttys005    0:01.45 /usr/bin/python bin/django celeryd -l INFO
51472 ttys005    0:01.29 /usr/bin/python bin/django celeryd -l INFO
51510 ttys005    0:01.89 /usr/bin/python bin/django celeryd -l INFO
51801 ttys005    0:01.83 /usr/bin/python bin/django celeryd -l INFO
53470 ttys005    0:03.97 /usr/bin/python bin/django celeryd -l INFO
53780 ttys005    0:00.00 grep django

Son işlemin (yani ps komutumla aynı anda başlatılmış olan grep) rapor edilmesini önlemenin bir yolu var mı?

(Kelimenin tam anlamıyla eşleşecek, ancak kendisiyle eşleşmeyecek bir regex bulmaya başladım, ama doğru bir yaklaşım bu değildi ...)

Yanıtlar:


14

Cevabım bir pslistede "foobar" için arama tipik cevabı bir varyasyondur . Argümanı , sanırım "-A" "ps", daha taşınabilir olduğunu "aux", ancak bu değişiklik cevabı ile ilgisiz. Tipik cevap şöyle görünür:

$ ps -A -ww | grep [f]oobar

Bunun yerine bu deseni kullanıyorum:

$ ps -A -ww | grep [^]]foobar

Asıl avantajı, bu kalıplara dayanarak kod yazmanın daha kolay olmasıdır, çünkü aradığınız [^]]desen ile statik bir dizgiyi birleştirirsiniz . Dizenin ilk harfini çıkarmanız, sonra köşeli parantezin arasına yerleştirmeniz ve sonra tekrar bir araya getirmeniz gerekmez. Kabuk içinde komut dosyası [^]]yazarken, aradığınız desenin önüne kolayca yapıştırılabilir . Bash'de dize dilimleme çirkin bir şeydir, bu yüzden varyasyonum bundan kaçınır. Bu varyasyonda, desenin lider bir sağ köşeli ayraç OLMADIĞINDA desenle eşleştiği satırlar gösteriliyor. Köşeli parantezi hariç tutacak olan arama deseni aslında köşeli parantezi desene eklerse, o zaman hiçbir zaman kendi kendine eşleşmez.

Böylece taşınabilir bir psgrepkomutu aşağıdaki gibi yazabilirsiniz . Burada, Linux, OS X BSD ve diğerleri arasındaki farklar için bir miktar izin veriyorum. Bu sütun başlıklarını ekler, psdaha fazla özel sağlarpsihtiyaçlarıma göre daha iyi biçimli formatlar ve komut satırı argümanlarının hiçbirinin kaçırılmaması için ekstra geniş ve ekstra geniş listeleme işlemlerini görüntüler. Pek çoğu kaçırılmamış. Java, Java olduğundan, genellikle işleri en kötü şekilde yapar, bu nedenle bazı java servisleri, işlem tablosunun izleyeceği izin verilen maksimum bağımsız değişkenler uzunluğunu aşar. Bunun 1024 karakter olduğuna inanıyorum. Bir işlemi başlatmak için izin verilen komut uzunluğu çok daha uzundur, ancak çekirdek işlem tablosu 1K'nin üzerinde bir şey izlemekten zahmete girmez. Komut başlatıldığında, komut adı ve argüman listesine karşı ihtiyaç duyulmaz, bu nedenle işlem tablosunda saklanan şey yalnızca bilgi amaçlıdır.

psgrep ()
{
    pattern=[^]]${1};
    case "$(uname -s)" in
        Darwin)
            ps -A -ww -o pid,ppid,nice,pri,pcpu,pmem,etime,user,wchan,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
        ;;
        Linux)
            ps -A -ww -o pid,ppid,tid,nice,pri,pcpu,pmem,etime,user,wchan:20,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
        ;;
        *)  # other UNIX flavors get a minimalist version.
            ps -A -ww | grep -i -e ${pattern}
        ;;
    esac
}

Dezavantajı, bunun aslında orijinal düzenden bir karakter (daha fazla) eşleşmesidir. Örnek olarak, bu asla PID ile eşleşmeyecektir. Ve kullanıldığında biraz yanıltıcı olabilir grep --colour.
Tonin

67

@ Jamzed kısa cevap için +1, ancak OP'in bir açıklama yapması gerekebilir:

ps | grep "[d]jango"

Bu regex kullanarak kendi ps dize normal ifadesi eşleşirse beri, kendisini maç olmayacak bir süreç başlatıyoruz "django"değil "[d]jango". Bu şekilde, bu durumda grep olan "[d] jango" dizgisine sahip olan işlemi dışlayacaksınız; Aynı şey, regex'i tanımlamak için kullandığınız her şeye pgrep, egrep, awk, sed vb. Gibi uygulanabilir.

7 erkeklerden regex

   A bracket expression is a list of characters enclosed in "[]".  It nor‐
   mally matches any single character from the list (but see  below).   If
   the  list  begins  with  '^',  it matches any single character (but see
   below) not from the rest of the list.  If two characters  in  the  list
   are  separated  by '-', this is shorthand for the full range of charac‐
   ters between those two (inclusive) in the collating sequence, for exam‐
   ple,  "[0-9]" in ASCII matches any decimal digit.  It is illegal(!) for
   two ranges to share an endpoint, for example, "a-c-e".  Ranges are very
   collating-sequence-dependent,  and portable programs should avoid rely‐
   ing on them.

2
Güzel. Aslında regex'ler konusunda oldukça rahatım ama regexp'in eşleşmesini önlemenin bir yolunu hemen düşünemedim. Bir mektubu köşeli parantez içine almak mükemmel bir anlam ifade eder. ([^!] Gibi bir şey dahil de çalışacaktı ...)
Steve Bennett

1
Güzel ve kurnazlık.
kül

'Ps' özel durumu için, aradığım işlem adının önünde '[]' kullanıyorum. Öyleyse, işlem adını özel olarak regex için ayrıştırmaya ihtiyacım yok, ancak yine de eşleşiyor.
Neromancer

@hmontoliu Bu örneğin çalışmaz: ps aux | grep [s]cript1. Çözüm hakkında yorumda yardımcı olabilir misiniz?
SOUser

@hmontoliu Benim hatam. Görünen o ki, önceki aramalar nedeniyle satır gösteriliyor ...
SOUser

30

ps | grep [d]jango

ps | grep d[j]ango

...

ps | grep djang[o]


Bir char grep gerekiyorsa boşluk ekleyin:ps aux| grep "[Z] "
AD

@ jamzed Bu örneğin çalışmıyor: ps aux | grep [s]cript1veya ps aux | grep [s]cript2. Grep çizgisi hala gösterilmektedir. Çözüm hakkında yorumda yardımcı olabilir misiniz?
SOUser

@ jamzed Benim hatam. Görünen o ki, önceki aramalar nedeniyle satır gösteriliyor ...
SOUser

18

Bunun yerine pgrep kullanın: pgrep -lf django


Her zamanki gibi platformdan bahsetmeyi unuttum (bu durumda OS X). Muhtemelen pgrep, çeşitli linuxlar üzerinde çalışmaktadır.
Steve Bennett,

Katılmıyorum, @ramruma. Bu konuya tam olarak geldim çünkü pgrepbana bu sorunu tam olarak veriyor. Ancak şunu söylemeliyim ki CygWin'de test ediyorum ( psişlemin tam komut satırını gösteremiyorum).
Sopalajo de Arrierez,

El ile "Çalışan pgrep veya pkill işlemi hiçbir zaman kendisini bir eşleşme olarak bildirmeyecek" ifadesini kullanıyor ve aslında bunu görmedim.
16'da

Sadece pgrepkendisiyle eşleştiğini düşündüğüm bir problemle uğraşıyorum . Çalıştığım bashkomut dosyasının adıyla eşleştiği anlaşılıyor. Sabitleme -xekledikten sonra komut adında tam bir eşleşme yapar.
andynormancx

11

Oh bekleyin, bu işe yarıyor:

ps | grep django | grep -v grep

7
Yalnızca işlem komut satırı grepgenel olarak güvenemeyeceğiniz yasal olarak içermezse .
12'de bir CVn

8

ps -d | grep django

ps'den:

 -d                  Lists information  about  all  processes
                     except session leaders.

Hala benim üzerinde grep gösterir ...
Kevin

Evet, bu benim için OS X'de çalışıyor.
Steve Bennett

Linux'ta çok iyi çalışmıyor.
Acumenus

Daha genel olarak, psseçkin olarak taşınabilir olmayan seçenekler , bu nedenle bu platformun hangi platform için olduğu hakkında hiçbir bilgi olmadan, bu yanıt pek yardımcı olmuyor. Ayrıca, aradığınız sürecin bir süreç lideri olmadığından emin değilseniz, bu açıkça yeterli değildir (yani, hedefiniz bir servet ise bu yardımcı olabilir, ancak genel olarak başka türlü değil).
tripleee

Komik, Mac'te bu sadece grep sürecini gösteriyor ve diğer her şeyi filtreliyor gibi görünüyor .
Christopher Hunter,
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.