จะหยุดทุบตีในขณะที่วนรอบทำงานในพื้นหลังได้อย่างไร?


23

ฉันเริ่มในขณะที่ห่วงดังนี้:

while true; do {command}; sleep 180; done &

&แจ้งให้ทราบล่วงหน้า

ฉันคิดว่าเมื่อฉันฆ่าสถานีนี้ในขณะที่วงจะหยุด แต่มันยังคงไป เป็นเวลาหลายชั่วโมงแล้วที่ฉันฆ่าเซสชันเทอร์มินัล

ฉันจะหยุดสิ่งนี้ในขณะที่วนรอบได้อย่างไร

คำตอบ:


38

ฉันเร่ม

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 %

5

ฉันต้องทราบว่าเมื่อคุณปิดเทอร์มินัลที่คุณป้อนคำสั่งนั้นคำสั่งย่อยควรจะตายพร้อมกับมัน พยายามทำซ้ำสิ่งนี้แสดงพฤติกรรมนี้

ทีนี้สมมติว่าคุณอยู่ในสถานการณ์ที่สิ่งนี้ไม่ได้เกิดขึ้นวิธีหนึ่งในการฆ่าโปรแกรมที่คุณทำงานในพื้นหลังซึ่งเกิดจาก&ตอนท้ายของคำสั่งมีดังนี้:

  1. เปิดเชลล์ใหม่และเรียกใช้echo $$เพื่อจดบันทึก PID ปัจจุบันของคุณ (ID กระบวนการ) เพื่อที่คุณจะได้ไม่ฆ่าเซสชันของคุณเอง
  2. ระบุ PID ของโปรแกรมที่คุณคิดว่ายังทำงานอยู่ คุณสามารถทำได้โดยใช้ps -ef | grep $SHELLคำสั่งเพื่อค้นหาว่าโปรแกรมใดกำลังใช้เชลล์
  3. บันทึกคอลัมน์ที่ 2 จากทางซ้ายแล้วจดค่าตัวเลขที่แตกต่างจากecho $$ผลลัพธ์ของคุณด้านบน นี่คือ PID ที่คุณต้องการฆ่า
  4. เรียกใช้kill -SIGTERM <pid>คำสั่งโดยที่<pid>เป็นค่าตัวเลขที่คุณระบุในขั้นตอนที่ 3
  5. ยืนยันว่าโปรแกรมไม่ทำงานอีกต่อไปโดยทำซ้ำขั้นตอนที่ 2

คุณสามารถรีสตาร์ทเซสชันหรือคอมพิวเตอร์ของคุณได้ แต่ด้านบนจะช่วยให้คุณสามารถหลีกเลี่ยงได้


2
คุณสามารถใช้topเพื่อฆ่ากระบวนการด้วยการกดkจากนั้นป้อน PID จากนั้นกด Enter สองครั้ง
luk3yx

-1

&จะทำให้ขั้วสร้างกระบวนการใหม่และได้รับรหัสของคุณทำงานอยู่ข้างใน ดังนั้นรหัสของคุณจะเป็นอิสระจากกระบวนการเทอร์มินัล แม้ว่าคุณจะปิดเทอร์มินัลกระบวนการใหม่ที่รหัสของคุณกำลังทำงานจะไม่หยุด ดังนั้นทั้งลบ&หรือค้นหากระบวนการของคุณและฆ่ามันps -auxkill (process id)


-3

โดยปกติbgสำหรับ background fgสำหรับเบื้องหน้า ถ้าคุณใช้& symbol ใช้ fg มันจะแสดงโปรแกรมที่กำลังทำงานอยู่ กดCtrl + Cเพื่อฆ่า


3
การใช้bg/ จะไม่ทำงานครั้งเดียวขั้วออกจากfg bashจะไม่สามารถกลับไปใช้อีกครั้งได้reptyrเนื่องจากbashมีกระบวนการลูก ( sleep)
xiota

เขาปิดสถานีเพราะเขาจะฆ่ากระบวนการนั้น ดังนั้นครั้งต่อไปเขาจะใช้ fg เพื่อปิดโปรแกรม ง่าย
อยากรู้อยากเห็น

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