มีงานที่หยุด (เมื่อ bash exit)


157

ฉันได้รับข้อความThere are stopped jobs.เมื่อพยายามออกจาก bash shell บางครั้ง นี่เป็นสถานการณ์จำลองที่ทำซ้ำได้ใน python 2.x:

  • ctrl+ cได้รับการจัดการโดยล่ามเป็นข้อยกเว้น
  • ctrl+ z'หยุด' กระบวนการ
  • ctrl+ dออกจาก python สำหรับ reals

นี่คือเอาต์พุตเทอร์มินัลในโลกแห่งความจริง:

example_user@example_server:~$ python
Python 2.7.3 (default, Sep 26 2013, 20:03:06) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

ctrl+z

[1]+  Stopped                 python
example_user@example_server:~$ exit
logout
There are stopped jobs.

Bash ไม่ได้ออกจากฉันต้องexitอีกครั้งเพื่อออกจากเปลือก bash

  • ถาม: 'หยุดงาน' หมายถึงอะไร?
  • ถาม:กระบวนการที่หยุดทำงานสามารถดำเนินการต่อได้หรือไม่
  • ถาม:คนแรกที่exitฆ่างานที่หยุดทำงานหรือไม่?
  • ถาม:มีวิธีการออกจากเปลือกในครั้งแรกหรือไม่? (โดยไม่ต้องป้อนexitสองครั้ง)

ctrl + shift + \ จะทำให้ python ออกจาก
ThorSummoner

คำตอบ:


205

งานที่หยุดทำงานคืองานที่หยุดทำงานชั่วคราวและไม่ทำงานอีกต่อไป แต่ยังใช้ทรัพยากรอยู่ (เช่นหน่วยความจำระบบ) เนื่องจากงานนั้นไม่ได้เชื่อมต่อกับเทอร์มินัลปัจจุบันจึงไม่สามารถสร้างเอาต์พุตและไม่ได้รับอินพุตจากผู้ใช้

คุณสามารถเห็นงานที่คุณรันโดยใช้jobsคำสั่ง builtin ใน bash ซึ่งอาจเป็นเชลล์อื่นเช่นกัน ตัวอย่าง:

user@mysystem:~$ jobs
[1] + Stopped                python
user@mysystem:~$ 

คุณสามารถหยุดงานที่หยุดทำงานต่อได้โดยใช้fgคำสั่งในตัว(ส่วนหน้า) bash ถ้าคุณมีหลายคำสั่งที่ได้รับการหยุดคุณจะต้องระบุว่าหนึ่งในการดำเนินการต่อโดยผ่านหมายเลข jobspec fgในบรรทัดคำสั่งด้วย หากหยุดโปรแกรมเพียงหนึ่งโปรแกรมคุณสามารถใช้fgคนเดียว:

user@mysystem:~$ fg 1
python

ณ จุดนี้คุณกลับมาที่ล่ามงูหลามและอาจออกโดยใช้ control-D

ในทางกลับกันคุณอาจkillสั่งให้มันเป็น jobspec หรือ PID ตัวอย่างเช่น

user@mysystem:~$ ps
  PID TTY          TIME CMD
16174 pts/3    00:00:00 bash
17781 pts/3    00:00:00 python
18276 pts/3    00:00:00 ps
user@mysystem:~$ kill 17781
[1]+  Killed                  python
user@mysystem:~$ 

หากต้องการใช้ jobspec ให้นำหน้าหมายเลขด้วยปุ่มเปอร์เซ็นต์ (%):

user@mysystem:~$ kill %1
[1]+  Terminated              python

หากคุณออกคำสั่ง exit ด้วยงานที่หยุดทำงานคำเตือนที่คุณเห็นจะได้รับ งานจะถูกทิ้งไว้เพื่อความปลอดภัย เพื่อให้แน่ใจว่าคุณรู้ว่าคุณกำลังพยายามฆ่างานที่คุณอาจลืมไปแล้วว่าหยุด ครั้งที่สองที่คุณใช้คำสั่ง exit งานจะถูกยกเลิกและเชลล์จะออก นี่อาจทำให้เกิดปัญหาสำหรับบางโปรแกรมที่ไม่ได้ตั้งใจจะฆ่าในแบบนี้

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

นอกจากนี้โปรดทราบว่าบางโปรแกรมอาจไม่ออกเมื่อสิ้นสุดด้วยวิธีนี้และระบบของคุณอาจจบลงด้วยกระบวนการที่ไม่ได้ใช้งานจำนวนมากโดยใช้ทรัพยากรมากขึ้นหากคุณทำเช่นนี้

โปรดทราบว่าคุณสามารถสร้างกระบวนการพื้นหลังที่จะหยุดหากพวกเขาต้องการให้ผู้ใช้ป้อน:

user@mysystem:~$ python &
[1] 19028
user@mysystem:~$ jobs
[1]+  Stopped                 python

คุณสามารถดำเนินการต่อและฆ่างานเหล่านี้ได้ในลักษณะเดียวกับที่คุณทำกับงานที่คุณหยุดทำงานด้วยการCtrl-zขัดจังหวะ


4
ฉันจะเล่นลิ้นกับประโยคที่สองของคุณ มันควรพูดว่า“ เนื่องจากงานหยุดทำงานจึงไม่สามารถดำเนินการใด ๆ - ไฟล์ I / O, เครือข่าย I / O, เทอร์มินัล I / O, หรือการประมวลผลอื่น ๆ ”
สกอตต์

2
มันช่วยฉันได้มาก
shellbye

โพสต์ที่ยอดเยี่ยมความช่วยเหลือที่ดีสำหรับทุกคน!
George Udosen

18

ถาม: 'หยุดงาน' คืออะไรหรือสิ่งนี้หมายความว่าอย่างไร

งานที่หยุดหมายถึงกระบวนการที่ได้รับสัญญาณหยุด ( SIGSTOP/ SIGTSTP) จากแป้นพิมพ์ (ตัวอักษรระงับCtrl-Z) คำสั่ง (เช่นkill -STOP [PID]) หรือกระบวนการอื่น (เช่นเคอร์เนลเมื่อระบบขาดทรัพยากร) และอยู่ในสถานะหยุดชั่วคราวดังนั้นจึงบอกให้ระบบหยุด / หยุดชั่วคราว กระบวนการดังนั้นมันจะไม่ทำการประมวลผล / ประมวลผลใด ๆ

jobsงานเปลือกใช้งานสามารถแสดงโดย:

ถาม: กระบวนการที่หยุดทำงานสามารถดำเนินการต่อได้หรือไม่

กระบวนการที่หยุดจะทำงานต่อเมื่อมีการส่งSIGCONTสัญญาณ สิ่งนี้สามารถทำได้โดยfg(หรือfg ID) ซึ่งจะย้ายงานไปยังส่วนหน้าทำให้งานปัจจุบันbgดำเนินต่อไปในพื้นหลังหรือส่งSIGCONTสัญญาณ (เช่นkill -CONT [PID])

ถาม: ทางออกแรกจะฆ่างานที่หยุดหรือไม่

ครั้งแรกเมื่อคุณพิมพ์exit/ logoutหรือกดCtrl-D, เชลล์พิมพ์ข้อความเตือนเกี่ยวกับงานที่ใช้งานอยู่ในปัจจุบันที่เชื่อมโยงกับเครื่องของคุณดังนั้นมันจะไม่ฆ่าคุณโดยไม่ได้รับอนุญาตจากคุณโดยยืนยันการกระทำครั้งที่สอง หากcheckjobsเปิดใช้งานตัวเลือก ( shopt -s checkjobs) จะสามารถแสดงรายการงานที่มีสถานะ

ถาม: มีวิธีการออกจากเปลือกในครั้งแรกหรือไม่? (โดยไม่ต้องออกจากทางออกสองครั้ง)

คุณสามารถกดCtrl+Dสองครั้งหรือกดค้างไว้นาน ๆ เพื่อออกจาก shell เงียบอย่างรวดเร็วฆ่างานหยุด / ทำงานปัจจุบัน

อีกทางเลือกหนึ่งปฏิเสธพวกเขา ( disown) เพื่อปล่อยพวกเขาหรือฆ่าพวกเขาด้วยตนเอง: kill $(jobs -p).

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