Grep'i işlem listesinden hariç tutma


27

Çalışan bir daemonun işlem kimliğini döndürmek için bir komutu bir araya getirdim:

ps aux | grep daemon_name | awk "{ print \$2 }"

Mükemmel çalışıyor ve PID'yi döndürüyor, ancak şimdi çalıştığım işlem olan ikinci bir PID'yi de döndürüyor. Komutumu dönen PID'lerin listesinden çıkarmamın bir yolu var mı?

Birkaç kez test ettim ve komutum her zaman listedeki ikinci PID, ancak yanlış olması durumunda sadece ilk PID'yi almak istemiyorum.


Yanıtlar:


27

grep'in -vanahtarı, sırayı değiştirmeden sonucu tersine çevirir. Öyleyse şöyle yap:

ps aux | grep daemon_name | grep -v "grep daemon_name" | awk "{ print \$2 }"

Upd . -CŞunun gibi komut adını belirtmek için de kullanabilirsiniz :

ps -C daemon_name -o pid=

İkincisi -o, listede hangi bilgilerin sütunlarını istediğinizi belirler. pidsadece işlem kimliği sütununu listeler. Ve =ondan sonraki eşit işaret pidbunun için sütun başlığı olmayacağı anlamına gelir, bu nedenle yalnızca net sayıları elde edersiniz - PID'ler.

Bu yardımcı olur umarım.


2
"Grep -v grep" kullanarak: "grep" de dahil olmak üzere uzun bir komut satırı olabileceğine dikkat edin (Birinin grep kitaplığı yazdığını varsayalım => "-Llibgrep.so" veya "-cp libgrep.jar"). Deseni tekrar ediyorum: grep -v "grep daemon_name"
phil_w

İyi nokta, @phil_w, teşekkürler. Cevap güncellendi.
Serg ikS

23

Bir karakter sınıfı hilesi kullanabilirsiniz. "[d]", "[d]" yalnızca "d" ile eşleşmiyor.

 ps aux | grep [d]aemon_name | awk "{ print \$2 }"

Bunu kullanmayı tercih ediyorum | grep -v grep.


Bu akıllıca bir numara, hoşuma gitti. Öğrenirken, şu anda işleri basit | grep -v greptutuyorum ve kodumu tekrar ziyaret ettiğimde anlaşılması daha kolay olacak.
tak

Bu hınnın nasıl çalıştığını anlamaya çalışıyorum. Ne demek istediğini açıklayabilir misin "[d]" does not match "[d]" only "d"?
Nowaker

@Damian: Köşeli parantezler , arama ifadesinde meta karakterlerdir (karakter kümesini sınırlar), bu nedenle grepkomut ps, grepkomutun kendisinin çıkış satırıyla eşleşmeyecektir (asıl soruda "ikinci PID" olarak adlandırılır). ifade a[xy]d, metin ile eşleşmiyora[xy]d , metin axdveya metin ile eşleşiyor ayd. Bu nedenle, ifade [f]oometinle eşleşir fooancak metinle eşleşmez [f]oo. Umarım açıktır.
RedGrittyBrick 28:13

Tamam, ARGV konusunda yanılmışım. Bu sadece bir regexp. Teşekkürler.
Nowaker

Şeytani zekice! Bir an için düşünmek zorunda kaldım - teşekkürler!
Subfuzion

15

psDaha güvenilir alternatifler varsa çıktının çıktısını almaktan kaçının .

pgrep daemon_name
pidof daemon_name

Yay, nihayet süreç yönetimi artık mantıklı geliyor.
Błażej Michalik

pgreppidoftam eşleşme sırasında alt dizeyle arama yapar - tam ihtiyacım olan şey! Teşekkürler!
Sasha

3

Bu ps -Cseçenek tüm Unix tabanlı sistemlerde evrensel değil, sisteminizde çalışıyorsa geçerlidir. Bunun yerine, tamamen bir araya gelmekten kaçınırdım:

ps aux | awk '/daemon_name/ && !/awk/ { print $2 }'

Tek tırnak içinde hiçbir şeyden kaçmana gerek yok. ps auxçoğu Unix tabanlı sistemdeki işlemlerin tam listesini verir ve awkgenellikle varsayılan olarak yüklenir.


3

pgrepBir işlemin ismini ada göre aramak için kullanın :

pgrep proc_name

Sonuçtaki ekstra işlem adı ile ( -l):

pgrep -l proc_name

İşlem adını ( -l) ve bağımsız değişkenleri ( -f) arayın ve görüntüleyin :

pgrep -lf proc_name_or_argument

İşin iyi yanı pgrep, kendisini asla bir eşleşme olarak rapor etmeyecek olmasıdır. Ancak, ödemeyi almanız pgrepve ardından ilgili süreci öldürmeniz gerekmez kill. pkillBunun yerine kullanın :

pkill proc_name

SIGKILLSinyal ( -9veya -KILL) yerine SIGTERM(varsayılan olarak) belirtin :

pkill -9 proc_name

İşlem adını ( -l) ve arguments ( -f) 'yi arayın , sinyal ( veya ) ile -Iöldürmeden önce onay ( ) isteyin :SIGKILL-9-KILL

pkill -KILL -Ilf proc_name_or_argument

-ISeçeneğin yalnızca bazı sürümlerinde pkill, örneğin OS X Mavericks'te geçerli olduğuna dikkat edin .


0

Bash kullanıyorsanız, bunu kullanarak aşağıdaki şekilde de yapabilirsiniz: ps -eaf

PIDS=$(ps -eaf)
PID=$(echo "$PIDS" | grep "process_name" | awk '{print $2}')
echo $PID

Bu gereksiz yere karmaşıktır. Neden sadece aramıyorsunuzps -eaf | grep "process_name" | awk '{print $2}'
David Nedrow, 4:18

0

bu satır size "grep" hariç geri ödemeyi (işlem kimliğini) geri verir

PID=$(ps aux | grep '/usr/bin/python2.7 manage.py SES__boto3_sqs_read' | grep -v grep)

Bazı açıklamalar iyi olurdu.
davidbaumann

Bu temelde kabul edilen cevap ile aynıdır ancak farklı dekorasyona sahiptir.
Scott
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.