ฉันเริ่มในขณะที่ห่วงดังนี้:
while true; do {command}; sleep 180; done &
&แจ้งให้ทราบล่วงหน้า
ฉันคิดว่าเมื่อฉันฆ่าสถานีนี้ในขณะที่วงจะหยุด แต่มันยังคงไป เป็นเวลาหลายชั่วโมงแล้วที่ฉันฆ่าเซสชันเทอร์มินัล
ฉันจะหยุดสิ่งนี้ในขณะที่วนรอบได้อย่างไร
ฉันเริ่มในขณะที่ห่วงดังนี้:
while true; do {command}; sleep 180; done &
&แจ้งให้ทราบล่วงหน้า
ฉันคิดว่าเมื่อฉันฆ่าสถานีนี้ในขณะที่วงจะหยุด แต่มันยังคงไป เป็นเวลาหลายชั่วโมงแล้วที่ฉันฆ่าเซสชันเทอร์มินัล
ฉันจะหยุดสิ่งนี้ในขณะที่วนรอบได้อย่างไร
คำตอบ:
ฉันเร่ม
while true; do yad; sleep 60; done &
และปิดเทอร์มินัลเพื่อทดสอบตอนนี้ฉันได้รับปัญหาเดียวกัน
มาดูภาพรวมของกระบวนการทำงานด้วยps fjx, บรรทัดสุดท้ายในเครื่องของฉันอ่าน
2226 11606 11606 19337 ? -1 S 1000 0:00 \_ /bin/bash
11606 22485 11606 19337 ? -1 S 1000 0:00 | \_ sleep 10
2226 9411 9411 8383 ? -1 S 1000 0:00 \_ /bin/bash
9411 17674 9411 8383 ? -1 Sl 1000 0:00 \_ yad
1 2215 2215 2215 ? -1 Ss 1000 0:00 /lib/systemd/systemd --user
2215 2216 2215 2215 ? -1 S 1000 0:00 \_ (sd-pam)
คุณสามารถมองเห็นyadเป็นกระบวนการย่อยของ/bin/bashถ้าผมปิดyadมันเปลี่ยนแปลงไปในการส่งออกของsleep 60 psหากมุมมองแบบต้นไม้สับสนเกินไปคุณสามารถค้นหาผลลัพธ์ดังนี้1 :
ps fjx | grep "[y]ad" # or respectively
ps fjx | grep "[s]leep 60"
บรรทัดเอาต์พุตเริ่มต้นด้วยตัวเลขสองตัวอันแรกคือ PPID, ID กระบวนการของกระบวนการพาเรนต์และที่สองคือ PID, ID ของกระบวนการเอง เป็นเพราะสิ่งที่9411ปรากฏในทั้งสองแถวที่นี่:
2226 9411 9411 8383 ? -1 S 1000 0:00 \_ /bin/bash
9411 17674 9411 8383 ? -1 Sl 1000 0:00 \_ yad
นั่นคือbashsubshell ที่เราต้องการฆ่าและเราเพิ่งค้นพบ PID ของมันดังนั้นตอนนี้ทุกอย่างที่เหลืออยู่นั้นเรียบง่าย
kill 9411 # replace 9411 with the PID you found out!
และ subshell ที่น่ารำคาญนั้นหายไปได้ด้วยดี
1 : สัญกรณ์grep "[y]ad"แทนการgrep yadป้องกันไม่ให้grepกระบวนการแสดงขึ้นในรายการผลลัพธ์
bashจัดเตรียมตัวแปร$!ซึ่ง“ ขยายไปยัง ID กระบวนการของงานที่วางไว้ล่าสุดในพื้นหลัง” ดังนั้นสิ่งต่อไปนี้จะฆ่ากระบวนการล่าสุดในพื้นหลัง:
kill $!
หากไม่ใช่กระบวนการล่าสุดเพียงแค่รับรายการของงานที่กำลังรันด้วยjobsbuiltin ตัวอย่างผลลัพธ์:
[1]- Running while true; do
yad; sleep 60;
done &
[2]+ Stopped sleep 10
มีสองงานในรายการงานที่จะฆ่าหนึ่งของพวกเขาคุณสามารถเข้าถึงได้กับจำนวนงานหรือทางลัดที่มี%, %+(“งานปัจจุบัน”) และ%-(“งานก่อนหน้านี้”) เช่นการฆ่าห่วงทำงานในพื้นหลังที่คุณ ทำได้
kill %1 # or
kill %-
และเพื่อฆ่าsleep 10งานที่ถูกระงับ:
kill %2 # or
kill %+ # or
kill %
ฉันต้องทราบว่าเมื่อคุณปิดเทอร์มินัลที่คุณป้อนคำสั่งนั้นคำสั่งย่อยควรจะตายพร้อมกับมัน พยายามทำซ้ำสิ่งนี้แสดงพฤติกรรมนี้
ทีนี้สมมติว่าคุณอยู่ในสถานการณ์ที่สิ่งนี้ไม่ได้เกิดขึ้นวิธีหนึ่งในการฆ่าโปรแกรมที่คุณทำงานในพื้นหลังซึ่งเกิดจาก&ตอนท้ายของคำสั่งมีดังนี้:
echo $$เพื่อจดบันทึก PID ปัจจุบันของคุณ (ID กระบวนการ) เพื่อที่คุณจะได้ไม่ฆ่าเซสชันของคุณเองps -ef | grep $SHELLคำสั่งเพื่อค้นหาว่าโปรแกรมใดกำลังใช้เชลล์echo $$ผลลัพธ์ของคุณด้านบน นี่คือ PID ที่คุณต้องการฆ่าkill -SIGTERM <pid>คำสั่งโดยที่<pid>เป็นค่าตัวเลขที่คุณระบุในขั้นตอนที่ 3คุณสามารถรีสตาร์ทเซสชันหรือคอมพิวเตอร์ของคุณได้ แต่ด้านบนจะช่วยให้คุณสามารถหลีกเลี่ยงได้
&จะทำให้ขั้วสร้างกระบวนการใหม่และได้รับรหัสของคุณทำงานอยู่ข้างใน ดังนั้นรหัสของคุณจะเป็นอิสระจากกระบวนการเทอร์มินัล แม้ว่าคุณจะปิดเทอร์มินัลกระบวนการใหม่ที่รหัสของคุณกำลังทำงานจะไม่หยุด ดังนั้นทั้งลบ&หรือค้นหากระบวนการของคุณและฆ่ามันps -auxkill (process id)
โดยปกติbgสำหรับ background fgสำหรับเบื้องหน้า ถ้าคุณใช้& symbol ใช้ fg มันจะแสดงโปรแกรมที่กำลังทำงานอยู่ กดCtrl + Cเพื่อฆ่า
bg/ จะไม่ทำงานครั้งเดียวขั้วออกจากfg bashจะไม่สามารถกลับไปใช้อีกครั้งได้reptyrเนื่องจากbashมีกระบวนการลูก ( sleep)
topเพื่อฆ่ากระบวนการด้วยการกดkจากนั้นป้อน PID จากนั้นกด Enter สองครั้ง