ฉันจะแนะนำคุณผ่านตัวอย่างที่ค่อนข้างซับซ้อนโดยอ้างอิงจากสถานการณ์ในชีวิตจริง
ปัญหา
สมมติว่าคำสั่ง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
ฉันสนใจเฉพาะในกระบวนการหนึ่งดังนั้นฉันใช้เพื่อหารายการที่สอดคล้องกับโปรแกรมของฉันgrep
conky
$ 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') คำสั่งของฉันอาจฆ่ากระบวนการทำงานทั้งหมดของเขาด้วยเช่นกัน!
สิ่งที่ฉันพูดคือระวังโดยเฉพาะอย่างยิ่งสำหรับท่อยาว มันจะดีกว่าเสมอในการสร้างมันแบบโต้ตอบตามที่เราทำที่นี่มากกว่าตั้งสมมติฐานและรู้สึกเสียใจในภายหลัง