ฉันเริ่มในขณะที่ห่วงดังนี้:
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
นั่นคือbash
subshell ที่เราต้องการฆ่าและเราเพิ่งค้นพบ PID ของมันดังนั้นตอนนี้ทุกอย่างที่เหลืออยู่นั้นเรียบง่าย
kill 9411 # replace 9411 with the PID you found out!
และ subshell ที่น่ารำคาญนั้นหายไปได้ด้วยดี
1 : สัญกรณ์grep "[y]ad"
แทนการgrep yad
ป้องกันไม่ให้grep
กระบวนการแสดงขึ้นในรายการผลลัพธ์
bash
จัดเตรียมตัวแปร$!
ซึ่ง“ ขยายไปยัง ID กระบวนการของงานที่วางไว้ล่าสุดในพื้นหลัง” ดังนั้นสิ่งต่อไปนี้จะฆ่ากระบวนการล่าสุดในพื้นหลัง:
kill $!
หากไม่ใช่กระบวนการล่าสุดเพียงแค่รับรายการของงานที่กำลังรันด้วยjobs
builtin ตัวอย่างผลลัพธ์:
[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 -aux
kill (process id)
โดยปกติbgสำหรับ background fgสำหรับเบื้องหน้า ถ้าคุณใช้& symbol ใช้ fg มันจะแสดงโปรแกรมที่กำลังทำงานอยู่ กดCtrl + Cเพื่อฆ่า
bg
/ จะไม่ทำงานครั้งเดียวขั้วออกจากfg
bash
จะไม่สามารถกลับไปใช้อีกครั้งได้reptyr
เนื่องจากbash
มีกระบวนการลูก ( sleep
)
top
เพื่อฆ่ากระบวนการด้วยการกดk
จากนั้นป้อน PID จากนั้นกด Enter สองครั้ง