จะค้นหา Process ID (PID) ของโปรแกรมเทอร์มินัลที่ใช้งานอยู่ได้อย่างไร?


117

ฉันกำลังเรียกใช้โปรแกรมในเทอร์มินัลที่ฉันหนีไม่พ้นCtrl- Cและฉันต้องการที่จะฆ่า ฉันจะหา PID ได้อย่างไร


1
นี่เป็นสาขาหนึ่งของสิ่งที่ฉันควรทำเมื่ออูบุนตูหยุดทำงาน? เป็นข้อมูลอ้างอิงเพื่อป้องกันรายละเอียดในคำถามนั้นไม่ให้กลายเป็นเทคนิคเกินไป
Jjed

มีคำสั่งpidof
NeverMind9

คำตอบ:


128

เปิดเทอร์มินัลอื่นแล้วรันps ax | grep fooโดยที่ foo เป็นชื่อของโปรแกรมที่ไม่ตอบสนอง สิ่งนี้ควรส่งคืนบรรทัดเอาต์พุตที่มีลักษณะดังนี้:

$ ps ax | grep firefox
2222 ?        S      0:00 /bin/sh /usr/lib/firefox-3.6.9/firefox
2231 ?        Sl   514:36 /usr/lib/firefox-3.6.9/firefox-bin
30290 pts/2    S+     0:00 grep --color=auto firefox

ฟิลด์แรกของแต่ละบรรทัดผลลัพธ์เป็นหมายเลขที่แสดงถึง Process ID ของโปรแกรมที่จับคู่โดยgrep(คุณสามารถละเว้นฟิลด์สุดท้ายซึ่งแสดงถึงgrepตัวเองได้อย่างปลอดภัย

หากต้องการหยุดกระบวนการที่กระทำผิดให้ทำ: kill pidโดย pid คือ ID กระบวนการของโปรแกรม คุณอาจต้องใช้วิจารณญาณของคุณในการพิจารณาว่าการแข่งขันประเภทใดที่จะต้องมีการkillแก้ไขหรือคุณสามารถใช้topแทนได้ การใช้killด้วยตัวเองจะส่ง SIGTERM ซึ่งคุณควรลองก่อนเพราะจะทำให้โปรแกรมสามารถล้างข้อมูลได้อย่างถูกต้อง หาก SIGTERM ล้มเหลวลอง SIGHUP ซึ่งเป็นยา kill -HUP pidstonger: หากสิ่งอื่นล้มเหลวให้ส่ง SIGKILL แต่คุณควรทำเช่นนั้นเป็นทางเลือกสุดท้ายเนื่องจาก SIGKILL ทำให้เคอร์เนลยุติกระบวนการทันทีโดยไม่มีความเป็นไปได้ในการล้างข้อมูล ในบางครั้งอาจส่งผลให้ข้อมูลเสียหายหรือเกิดปัญหาอื่น ๆ ดังนั้นอีกครั้งให้ส่ง SIGKILL เป็นทางเลือกสุดท้าย ที่จะทำเช่นนั้นหรือkill -KILL pidkill -9 pid

หากคุณใช้งานอินเทอร์เฟซแบบกราฟิกแน่นอนว่าคุณไม่จำเป็นต้องหลอกให้ใช้บรรทัดคำสั่งที่บ้าคลั่งเพื่อทำงานให้เสร็จ เพียงแค่เปิด "การตรวจสอบระบบ" ไปที่แท็บกระบวนการเลือกกระบวนการที่คุณต้องการหยุด (อืมมันอาจจะเป็นอันที่ใช้ CPU 90% ใช่หรือไม่) และคลิกขวา เนื่องจากกระบวนการหยุดทำงานแล้ว (นั่นเป็นปัญหาใช่ไหม) เลือก End Process หรือ Kill Process จากเมนูผลลัพธ์

สินเชื่อเพื่อkoanhead


5
ผู้ใช้ไม่ควรใช้ SIGKILL (kill -9) เว้นแต่ว่าวิธีอื่นทั้งหมดจะล้มเหลว รายการเท่านั้นkill -9เป็นคำแนะนำที่ไม่ดี ฉันได้แก้ไขคำตอบเพื่อแก้ไข
Scott Severance

ฉันจะค้นหา pid ของฟังก์ชันที่กำหนดเองได้อย่างไร ฉันมีฟังก์ชั่นที่มีห่วงกับที่สั่งการและping sleepตามunix.stackexchange.com/a/275826/72988multiplexerมันเป็นไปไม่ได้ในอูบุนตูโดยไม่ต้อง
Timo

49

ฉันไม่คิดว่ามีความต้องการคำสั่งยาว ๆ เช่นนี้เมื่อคุณสามารถทำคำสั่งเดียวกันได้ด้วย pgrep, pkill, pidof ฯลฯ ...

  • เพื่อรับ pid ของ Running-Program

pgrep:

   pgrep [options] pattern

DESCRIPTION: pgrep ค้นหากระบวนการที่กำลังทำงานอยู่และแสดง ID กระบวนการที่ตรงกับเกณฑ์การเลือกไปยัง stdout เกณฑ์ทั้งหมดต้องตรงกัน ตัวอย่างเช่น,

  • ในการค้นหากระบวนการที่ชื่อ sshd เป็นเจ้าของโดยรูท

    $ pgrep -u root sshd
    
  • แสดงกระบวนการที่เป็นเจ้าของโดย root OR daemon

    $ pgrep -u root,daemon
    

pidof:

DESCRIPTION :

Pidof ค้นหารหัสกระบวนการ (pids) ของโปรแกรมที่มีชื่อ มันพิมพ์รหัสเหล่านั้นในการส่งออกมาตรฐาน

ไวยากรณ์: pidof program_name

  • ในการฆ่าโปรแกรมด้วย pid ให้ใช้ตัวอย่าง pkill:

    pkill pid    
    pkill -f process_name    
    pkill -o process_name    
    pkill -n process_name    
    pkill -l process_name
    

    -fการตั้งค่าสถานะ: ค้นหา process_name (ดู man pkill) การ
    -oตั้งค่าสถานะ: เลือกเฉพาะกระบวนการที่ตรงกันที่เก่าที่สุด
    -nธง: เลือกเฉพาะกระบวนการจับคู่ใหม่ล่าสุด
    -lธง: รายการชื่อกระบวนการเช่นเดียวกับ ID กระบวนการ


1
นี่คือคำตอบที่ดีที่สุด
BlackDivine

21

วิธีที่ง่ายที่สุดที่จะรู้ว่า pid ของโปรแกรมที่กำลังใช้อยู่คือ:

pidof <application name>

ตัวอย่างเช่นหากคุณเริ่มเป็นกลุ่มและต้องการทราบ pid ของมัน:

pidof vim

จำไว้ว่าคุณจะต้องระบุชื่อโปรแกรมที่ถูกต้องที่เริ่มต้น

ตัวอย่างเช่นหากคุณกำลังใช้งาน vi และดำเนินการpidof vimคุณจะไม่ได้รับผลลัพธ์ที่ถูกต้อง

อ้างถึงpidofหน้าคู่มือสำหรับข้อมูลเพิ่มเติม


สิ่งนี้ไม่ได้ติดตั้งโดยค่าเริ่มต้น มันอาจจะอยู่ในแพ็คเกจ sysvinit-utils
flickerfly

ฉันได้รับ MariaDB pidof mysqldส่งคืน PID อย่างไรก็ตามหากฉันพิมพ์pidof Mariadbไม่มีอะไรจะส่งคืน เป็น PID เดียวกันสำหรับ MariaDB และ MySQL หรือไม่
Pathros

18

ฉันพบว่าเป็นการดีที่จะใช้การค้นหาแบบตัวพิมพ์เล็กและตัวพิมพ์ใหญ่โดยเพิ่ม "-i" และใช้ "aux" แทน "ax" เพื่อรับเอาต์พุตที่มีความหมายมากขึ้น:

ps aux | grep -i firefox

หากคุณต้องการฆ่ากระบวนการทั้งหมดที่คุณอาจใช้:

ps aux | grep -i firefox | awk {'print $2'} | xargs kill -9

นั่นคือการฆ่าที่มีพลัง ปล่อย "-9" ถ้าคุณต้องการการฆ่าแบบนุ่ม


5
นอกจากนี้ยังฆ่าps aux | grep -i firefox...กระบวนการเนื่องจากมีข้อความfirefoxอยู่ในคำสั่ง!
Eric

1
@Eric คุณสามารถใช้grep -i firefo[x]เพื่อจับคู่ firefox เท่านั้น
โฆษณา

@ john-foley ไม่แนะนำให้ใช้-9กับkillดูคำอธิบายได้ที่นี่
โฆษณา

3

ถ้าคุณต้องการเฉพาะ pid (มีประโยชน์สำหรับสคริปต์ autokill ฯลฯ ... )

pgrep -f desired_program_name

1

สำหรับผู้ที่ใช้งาน Ubuntu 16.04 LTS คุณจะต้องใช้งานps axและไม่เพียง แต่psที่บรรทัดคำสั่งมิฉะนั้นคุณจะได้รับกระบวนการที่วางไข่จากเทอร์มินัลเฉพาะที่คุณใช้งานอยู่ (โดยทั่วไปคือ 'ทุบตี' [เชลล์ที่คุณอยู่ ] และ 'ps' [สิ่งที่คุณเพิ่งวิ่ง])


ฉันชอบps -e(แสดงทั้งหมด) และps -ejH(แสดงแผนผังกระบวนการ)
Andrew

1
@ แอนดรูว์สวยหวานจริงๆ - ขอบคุณปลาย
cygnus_x1

0

นอกจากนี้คุณยังสามารถเปิดเทอร์มินัลอื่น (หรือสลับไปยัง tty อื่น) และเรียกใช้topซึ่งโดยทั่วไปจะเป็นเวอร์ชันข้อความของการตรวจสอบระบบ คอลัมน์แรกแสดงรายการ PID ของแต่ละกระบวนการที่กำลังทำงานซึ่งคุณสามารถฆ่าได้โดยการกดKป้อน PID แล้วป้อนสัญญาณตัวเลขที่จะส่ง


0

คุณสามารถทำได้:

ps ax | grep firefox | cut -f2 -d" " - | xargs kill -9

สองท่อแรกรับข้อมูลกระบวนการต่อไปเราพยายามรับคอลัมน์ PID โดยใช้การตัดแบบเก่าและจากนั้นเราให้ผลลัพธ์ PID ที่จะฆ่า


kill -9เป็นปืนที่ใหญ่ที่สุดที่คุณต้องฆ่ากระบวนการ คุณควรลองใช้สัญญาณที่นุ่มนวลกว่านี้ก่อนที่จะหันไปใช้ SIGKILL เพื่อให้กระบวนการล้างทรัพยากร
ผู้บัญชาการไบต์

นั่นเป็นความจริง @ByteCommander ฉันต้องการทำให้เป็นหนึ่งในสายการบินที่จะทำให้งานเสร็จ
Arian Soltani

0
top

หรือ

screen -list|ls

รายการ pid ทั้งหมดที่มีกระบวนการที่สอดคล้องกัน

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