ไม่รวม grep จากรายการกระบวนการ


27

ฉันได้คำสั่ง cobbled ร่วมกันเพื่อกลับ ID กระบวนการของ daemon ทำงาน:

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

มันทำงานได้อย่างสมบูรณ์และคืนค่า PID แต่ก็คืนค่า PID ที่สองซึ่งน่าจะเป็นกระบวนการที่ฉันใช้อยู่ตอนนี้ มีวิธีที่ฉันสามารถแยกคำสั่งของฉันออกจากรายการ PID ที่ส่งคืนหรือไม่

ฉันทดสอบมันสองสามครั้งและดูเหมือนว่าคำสั่งของฉันจะเป็น PID ตัวที่สองเสมอในรายการ แต่ฉันไม่ต้องการคว้า PID ตัวแรกในกรณีที่มันไม่ถูกต้อง


คำตอบ:


27

การ-vสลับของ grep ย้อนกลับผลลัพธ์โดยแยกออกจากคิว ดังนั้นทำให้มันเหมือน:

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

อัปเดต คุณสามารถใช้-Cสวิตช์เพื่อระบุชื่อคำสั่งดังนี้:

ps -C daemon_name -o pid=

หลัง-oกำหนดคอลัมน์ของข้อมูลที่คุณต้องการในรายการ pidแสดงรายการคอลัมน์รหัสกระบวนการเท่านั้น และเครื่องหมายเท่ากับ=หลังจากนั้นpidหมายความว่าจะไม่มีชื่อคอลัมน์สำหรับสิ่งนั้นดังนั้นคุณจะได้เฉพาะตัวเลขที่ชัดเจน - ของ PID

หวังว่านี่จะช่วยได้


2
การใช้ "grep -v grep": เพียงระวังว่าคุณอาจมีบรรทัดคำสั่งยาวรวมถึง "grep" (สมมติว่ามีคนเขียน grep ไลบรารี่ => "-Llibgrep.so" หรือ "-cp libgrep.jar" อย่างน้อย ฉันจะทำซ้ำรูปแบบ: grep -v "grep daemon_name"
phil_w

จุดดี @phil_w ขอบคุณ อัปเดตคำตอบ
Serg ikS

23

คุณสามารถใช้เล่ห์เหลี่ยมคลาสอักขระ "[d]" ไม่ตรงกับ "[d]" เท่านั้น "d"

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

| grep -v grepฉันชอบที่จะใช้นี้


Heh นั่นเป็นเคล็ดลับที่ฉลาดฉันชอบมัน ขณะนี้ฉันเรียนรู้สิ่งต่าง ๆ ได้ง่ายในขณะที่ฉันเรียนรู้และ| grep -v grepจะเข้าใจได้ง่ายขึ้นเมื่อฉันทบทวนรหัสของฉันอีกครั้ง
ตาก

ฉันพยายามที่จะเข้าใจวิธีการทำงานของ [h] ack นี้ คุณช่วยอธิบายสิ่งที่คุณหมายถึงด้วยได้"[d]" does not match "[d]" only "d"ไหม
Nowaker

@Damian: วงเล็บเหลี่ยมเป็นอักขระเมตา (ลบชุดอักขระ) ในนิพจน์การค้นหาดังนั้นgrepคำสั่งจะไม่ตรงกับpsบรรทัดเอาต์พุตสำหรับgrepคำสั่งนั้น (สิ่งที่เรียกว่า "PID ที่สอง" ในคำถามเดิม) แสดงออกa[xy]dไม่ไม่ตรงกับข้อความa[xy]dแต่มันก็ไม่ตรงกับข้อความหรือข้อความaxd aydดังนั้นการแสดงออก[f]ooตรงกับข้อความแต่ไม่ข้อความfoo [f]ooฉันหวังว่าชัดเจน
RedGrittyBrick

โอเคฉันผิดเกี่ยวกับ ARGV นี่เป็นเพียง regexp ขอบคุณ
Nowaker

ฉลาดแกมโกง! ต้องคิดถึงมันสักครู่ - ขอบคุณ!
Subfuzion

15

หลีกเลี่ยงการแยกวิเคราะห์psเอาต์พุตหากมีทางเลือกที่น่าเชื่อถือมากกว่า

pgrep daemon_name
pidof daemon_name

ใช่แล้วในที่สุดการจัดการกระบวนการก็สมเหตุสมผลแล้ว
Błażej Michalik

pgrepค้นหาด้วยสตริงย่อยในขณะที่pidofโดยจับคู่ที่ตรงกัน - exaclty สิ่งที่ฉันต้องการ! ขอบคุณ!
Sasha

3

ps -Cตัวเลือกที่ไม่เป็นสากลในทุกระบบปฏิบัติการยูนิกซ์ตาม แต่ถ้ามันทำงานบนระบบของคุณ แต่ฉันจะหลีกเลี่ยง grep ทั้งหมด:

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

ไม่จำเป็นต้องหลบหนีสิ่งใดในเครื่องหมายคำพูดเดี่ยว ps auxจะให้รายการของกระบวนการทั้งหมดในระบบที่ใช้ Unix เป็นส่วนใหญ่และawkโดยทั่วไปจะติดตั้งตามค่าเริ่มต้น


3

ใช้pgrepเพื่อค้นหา pid ของกระบวนการตามชื่อ:

pgrep proc_name

ด้วยชื่อกระบวนการพิเศษในผลลัพธ์ ( -l):

pgrep -l proc_name

ค้นหาและแสดงชื่อกระบวนการ ( -l) และอาร์กิวเมนต์ ( -f):

pgrep -lf proc_name_or_argument

สิ่งที่ดีเกี่ยวกับการpgrepที่จะไม่รายงานว่าตัวเองเป็นคู่ แต่คุณไม่จำเป็นต้องได้รับ pid โดยแล้วฆ่ากระบวนการที่สอดคล้องกันโดยpgrep killใช้pkillแทน:

pkill proc_name

ระบุSIGKILLสัญญาณ ( -9หรือ-KILL) แทนSIGTERM(โดยค่าเริ่มต้น):

pkill -9 proc_name

ค้นหาชื่อกระบวนการ ( -l) และข้อโต้แย้ง ( -f), ขอคำยืนยัน ( -I) ก่อนที่จะฆ่าด้วยSIGKILLสัญญาณ ( -9หรือ-KILL):

pkill -KILL -Ilf proc_name_or_argument

โปรดทราบว่า-Iตัวเลือกนี้มีเฉพาะในบางเวอร์ชั่นpkillเท่านั้นเช่นตัวเลือกใน OS X Mavericks


0

หากคุณกำลังใช้ bash คุณสามารถทำได้ในลักษณะต่อไปนี้โดยใช้ ps -eaf

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

มันซับซ้อนโดยไม่จำเป็น ทำไมไม่เรียกง่ายๆps -eaf | grep "process_name" | awk '{print $2}'
David Nedrow

0

บรรทัดนี้ให้ pid กลับมา (รหัสกระบวนการ) ยกเว้น "grep"

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

คำอธิบายบางอย่างจะดี
davidbaumann

นี่เป็นพื้นเหมือนกับคำตอบที่ยอมรับ แต่มีการตกแต่งต่างกัน
สกอตต์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.