Tidak termasuk grep dari daftar proses


27

Saya telah menyusun perintah untuk mengembalikan ID proses dari daemon yang sedang berjalan:

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

Ini berfungsi dengan baik dan mengembalikan PID, tetapi juga mengembalikan PID kedua yang mungkin merupakan proses yang saya jalankan sekarang. Apakah ada cara saya dapat mengecualikan perintah saya dari daftar PID yang dikembalikan?

Saya telah mengujinya beberapa kali dan tampaknya perintah saya selalu merupakan PID kedua dalam daftar, tetapi saya tidak ingin mengambil PID pertama jika itu tidak akurat.


Jawaban:


27

-vsakelar grep membalikkan hasilnya, mengeluarkannya dari antrian. Jadi buat seperti:

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

Pembaruan . Anda juga dapat menggunakan -Csakelar untuk menentukan nama perintah seperti:

ps -C daemon_name -o pid=

Yang terakhir -omenentukan kolom informasi mana yang Anda inginkan dalam daftar. pidhanya mencantumkan kolom id proses. Dan tanda sama dengan =setelah pidberarti tidak akan ada judul kolom untuk yang itu, sehingga Anda hanya mendapatkan angka yang jelas - PID.

Semoga ini membantu.


2
Menggunakan "grep -v grep": Perhatikan bahwa Anda mungkin memiliki baris perintah yang panjang termasuk "grep" (Katakanlah seseorang menulis perpustakaan grep => "-Llibgrep.so" atau "-cp libgrep.jar". Setidaknya Saya akan mengulangi polanya: grep -v "grep daemon_name"
phil_w

Poin bagus, @ phil_w, terima kasih. Diperbarui jawabannya.
Serg ikS

23

Anda dapat menggunakan trik kelas karakter. "[d]" tidak cocok dengan "[d]" hanya "d".

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

Saya lebih suka menggunakan ini | grep -v grep.


Heh itu trik yang pintar, saya suka itu. Saya menjaga hal-hal sederhana saat ini meskipun saat saya sedang belajar, dan | grep -v grepakan lebih mudah untuk dipahami ketika saya meninjau kembali kode saya.
Tak

Saya mencoba memahami bagaimana ini [h] ack bekerja. Bisakah Anda jelaskan apa maksud Anda "[d]" does not match "[d]" only "d"?
Nowaker

@Damian: Kurung kotak adalah metacharacters (membatasi serangkaian karakter) dalam ekspresi pencarian sehingga grepperintah tidak akan cocok dengan psgaris output untuk grepperintah itu sendiri (apa yang disebut "PID kedua" dalam pertanyaan asli). ekspresi a[xy]dtidak tidak cocok dengan teks a[xy]dtetapi tidak teks pertandingan axdatau teks ayd. Karenanya ekspresi [f]oococok dengan teks footetapi bukan teks [f]oo. Saya harap itu jelas.
RedGrittyBrick

Oke, saya salah tentang ARGV. Ini hanya regexp. Terima kasih.
Nowaker

Pintar sekali! Harus memikirkannya sejenak - terima kasih!
Subfuzion

15

Hindari parsing psoutput jika ada alternatif yang lebih andal.

pgrep daemon_name
pidof daemon_name

Yay, akhirnya manajemen proses masuk akal sekarang.
Błażej Michalik

pgrepmencari dengan substring sementara pidofdengan pencocokan tepat - tepat apa yang saya butuhkan! Terima kasih!
Sasha

3

The ps -Cpilihan adalah tidak universal pada semua sistem berbasis Unix tetapi jika bekerja pada sistem Anda. Sebaliknya saya akan menghindari grep sama sekali:

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

Tidak perlu melarikan diri dari apa pun dalam tanda kutip tunggal. ps auxakan memberi Anda daftar lengkap proses pada sebagian besar sistem berbasis Unix dan awkbiasanya diinstal secara default.


3

Gunakan pgrepuntuk mencari pid dari suatu proses dengan nama:

pgrep proc_name

Dengan nama proses ekstra di hasilnya ( -l):

pgrep -l proc_name

Cari dan tampilkan nama proses ( -l) dan argumen ( -f):

pgrep -lf proc_name_or_argument

Hal yang baik tentang itu pgrepadalah tidak akan pernah melaporkan dirinya sebagai pertandingan. Tetapi Anda tidak perlu mendapatkan pid pgreplalu mematikan proses yang sesuai kill. Gunakan pkillsebaliknya:

pkill proc_name

Tentukan SIGKILLsinyal ( -9atau -KILL) alih-alih SIGTERM(secara default):

pkill -9 proc_name

Cari nama proses ( -l) dan argumen ( -f), minta konfirmasi ( -I) sebelum mematikannya dengan SIGKILLsinyal ( -9atau -KILL):

pkill -KILL -Ilf proc_name_or_argument

Perhatikan bahwa -Iopsi ini hanya tersedia pada beberapa versi pkill, misalnya yang ada di OS X Mavericks.


0

Jika Anda menggunakan bash, Anda juga dapat melakukan ini dengan cara berikut dengan memanfaatkan ps -eaf

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

Ini tidak perlu rumit. Mengapa tidak menelepon sajaps -eaf | grep "process_name" | awk '{print $2}'
David Nedrow

0

baris ini memberi Anda kembali pid (proses id) tidak termasuk "grep"

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

Beberapa penjelasan akan menyenangkan.
davidbaumann

Ini pada dasarnya sama dengan jawaban yang diterima, tetapi dengan dekorasi yang berbeda.
Scott
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.