ฉันจะแนะนำคุณผ่านตัวอย่างที่ค่อนข้างซับซ้อนโดยอ้างอิงจากสถานการณ์ในชีวิตจริง
ปัญหา
สมมติว่าคำสั่งconkyหยุดการตอบสนองบนเดสก์ท็อปของฉันและฉันต้องการฆ่าด้วยตนเอง ฉันรู้ว่านิด ๆ หน่อย ๆ ของ Unix kill <PID>เพื่อให้ฉันรู้ว่าสิ่งที่ผมต้องทำคือการดำเนินการคำสั่ง เพื่อดึงข้อมูล PID ฉันสามารถใช้psหรือtopเครื่องมืออะไรก็ได้ที่ Unix ของฉันแจกจ่ายให้ฉัน แต่ฉันจะทำสิ่งนี้ในคำสั่งเดียวได้อย่างไร
ตอบ
$ ps aux | grep conky | grep -v grep | awk '{print $2}' | xargs kill
การปฏิเสธความรับผิด: คำสั่งนี้จะทำงานเฉพาะในบางกรณี อย่าคัดลอก / วางในเทอร์มินัลของคุณและเริ่มใช้มันอาจทำให้กระบวนการไม่น่าสงสัย แต่เรียนรู้วิธีการที่จะสร้างมันขึ้นมา
มันทำงานอย่างไร
1- ps aux
คำสั่งนี้จะส่งออกรายการกระบวนการที่กำลังทำงานอยู่และข้อมูลบางอย่างเกี่ยวกับพวกเขา ข้อมูลที่น่าสนใจคือมันจะส่งออก PID ของแต่ละกระบวนการในคอลัมน์ที่ 2 นี่คือสารสกัดจากผลลัพธ์ของคำสั่งในกล่องของฉัน:
$ ps aux
rahmu 1925 0.0 0.1 129328 6112 ? S 11:55 0:06 tint2
rahmu 1931 0.0 0.3 154992 12108 ? S 11:55 0:00 volumeicon
rahmu 1933 0.1 0.2 134716 9460 ? S 11:55 0:24 parcellite
rahmu 1940 0.0 0.0 30416 3008 ? S 11:55 0:10 xcompmgr -cC -t-5 -l-5 -r4.2 -o.55 -D6
rahmu 1941 0.0 0.2 160336 8928 ? Ss 11:55 0:00 xfce4-power-manager
rahmu 1943 0.0 0.0 32792 1964 ? S 11:55 0:00 /usr/lib/xfconf/xfconfd
rahmu 1945 0.0 0.0 17584 1292 ? S 11:55 0:00 /usr/lib/gamin/gam_server
rahmu 1946 0.0 0.5 203016 19552 ? S 11:55 0:00 python /usr/bin/system-config-printer-applet
rahmu 1947 0.0 0.3 171840 12872 ? S 11:55 0:00 nm-applet --sm-disable
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:38 conky -q
2- grep conky
ฉันสนใจเฉพาะในกระบวนการหนึ่งดังนั้นฉันใช้เพื่อหารายการที่สอดคล้องกับโปรแกรมของฉันgrepconky
$ ps aux | grep conky
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:39 conky -q
rahmu 3233 0.0 0.0 7592 840 pts/1 S+ 16:55 0:00 grep conky
3- grep -v grep
ดังที่คุณเห็นในขั้นตอนที่ 2 คำสั่งpsแสดงผลgrep conkyกระบวนการในรายการ (เป็นกระบวนการที่ทำงานหลังจากทั้งหมด) grep -v grepเพื่อที่จะกรองมันก็สามารถทำงานได้ ตัวเลือก-vบอกgrepให้จับคู่ทุกบรรทัดยกเว้นบรรทัดที่มีรูปแบบ
$ ps aux | grep conky | grep -v grep
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:39 conky -q
NB: ฉันชอบที่จะรู้วิธีการทำขั้นตอนที่ 2 และ 3 ในการgrepโทรครั้งเดียว
4- awk '{print $2}'
ตอนนี้ฉันแยกกระบวนการเป้าหมายออกแล้ว ฉันต้องการดึง PID ของมัน ในคำอื่น ๆ ฉันต้องการดึงคำที่ 2 ของผลลัพธ์ โชคดีสำหรับฉันส่วนใหญ่ (ทั้งหมดหรือไม่) ที่ทันสมัยที่สุดจะให้บางรุ่นawkภาษาสคริปต์ที่ไม่น่าแปลกใจกับข้อมูลแบบตาราง print $2งานของเราจะกลายเป็นเรื่องง่ายเหมือน
$ ps aux | grep conky | grep -v grep | awk '{print $2}'
1948
5- xargs kill
ฉันมี PID killทั้งหมดที่ฉันต้องการก็คือการผ่านไป xargsการทำเช่นนี้ผมจะใช้
xargs killจะอ่านจากอินพุต (ในกรณีของเราจากไพพ์) สร้างคำสั่งประกอบด้วยkill <items>( <items>เป็นสิ่งที่มันอ่านจากอินพุต) จากนั้นเรียกใช้คำสั่งที่สร้างขึ้น kill 1948ในกรณีของเราก็จะดำเนินการ ภารกิจเสร็จสมบูรณ์.
คำพูดสุดท้าย
โปรดทราบว่าขึ้นอยู่กับรุ่นของยูนิกซ์ที่คุณกำลังใช้งานบางโปรแกรมอาจทำงานแตกต่างกันเล็กน้อย (ตัวอย่างเช่นpsอาจส่งออก PID ในคอลัมน์ $ 3) หากสิ่งที่ดูเหมือนว่าผิดหรือแตกต่างกันอ่านเอกสารของผู้ขาย (หรือดีกว่าmanหน้า) ระวังด้วยเพราะท่อยาวอาจเป็นอันตรายได้ อย่าทำให้สมมติฐานใด ๆ โดยเฉพาะอย่างยิ่งเมื่อใช้คำสั่งเช่นหรือkill rmตัวอย่างเช่นหากมีผู้ใช้อื่นชื่อ 'conky' (หรือ 'Aconkyous') คำสั่งของฉันอาจฆ่ากระบวนการทำงานทั้งหมดของเขาด้วยเช่นกัน!
สิ่งที่ฉันพูดคือระวังโดยเฉพาะอย่างยิ่งสำหรับท่อยาว มันจะดีกว่าเสมอในการสร้างมันแบบโต้ตอบตามที่เราทำที่นี่มากกว่าตั้งสมมติฐานและรู้สึกเสียใจในภายหลัง