ฉันควรทำอย่างไรเมื่อพบข้อผิดพลาด 'มีการหยุดงาน'


62

ฉันเผชิญสถานการณ์ประเภทนี้หลายครั้ง

ตัวอย่างเช่นเมื่อใดก็ตามที่ฉันพยายามที่จะเปิดไฟล์บางอย่างในการemacsมีsudoสิทธิใช้:

sudo emacs tet.c &

แทนที่จะถามรหัสผ่าน Ubuntu เพียงแค่เริ่มต้นemacsกระบวนการโดยไม่มีemacsหน้าต่างหรือเอาท์พุทใด ๆ บนเทอร์มินัล (ยกเว้น pid) ดูรูป (ถ้าฉันไม่ได้ใช้ '&' มันจะขอรหัสผ่านจากฉัน):

ป้อนคำอธิบายรูปภาพที่นี่

ฉันมีสองคำถามที่เกี่ยวข้องกับเรื่องนี้:

  1. ฉันควรทำอย่างไรเมื่อพบข้อผิดพลาด 'มีการหยุดงาน' ฉันจะระบุงานที่หยุดเช่นนั้นทั้งหมดและฆ่าพวกเขาได้อย่างไร เมื่อฉันล้างเทอร์มินัลฉันจะไม่มี pids ของกระบวนการหยุดเหล่านี้

  2. ทำไม Ubuntu / emacs ทำตัวแบบนี้ ทำไมรหัสผ่านไม่ถามฉัน?

คำตอบ:


77

There are stopped jobsข้อความอยู่ห่างไกลเป็นข้อผิดพลาด เป็นเพียงการแจ้งเตือนที่บอกคุณว่าคุณพยายามที่จะออกจากเชลล์ แต่คุณมีงาน / โปรแกรมที่ถูกระงับอย่างน้อยหนึ่งรายการ (ในกรณีของคุณemacsซึ่งคุณใช้งาน&ในตอนท้ายของคำสั่ง) ระบบไม่อนุญาตให้คุณออกจากเชลล์และฆ่างานเว้นแต่ว่าคุณต้องการ คุณสามารถทำสิ่งต่าง ๆ สองสามตอบสนองต่อข้อความนี้:

  • ใช้jobsคำสั่งเพื่อบอกงานที่คุณหยุดทำงาน
  • คุณสามารถเลือกที่จะเพิ่มงานในfgคำสั่งเบื้องหน้าโดยใช้คำสั่ง
  • หากคุณไม่สนใจว่างานจะจบลงหรือไม่คุณสามารถพิมพ์ได้exitอีกครั้ง การพิมพ์exitครั้งที่สองโดยมีหรือไม่มีjobsคำสั่งการแทรกแซงจะส่งผลให้มีการยกเลิกงานที่ถูกระงับทั้งหมด

เพื่อตอบคำถามที่สองฉันจะบอกคุณว่าไม่ใช่ Ubuntu หรือ emacs ที่ทำตัวเป็นแบบนี้ นี่เป็นพฤติกรรมปกติเมื่อคุณทำให้แอปพลิเคชันทำงานในพื้นหลัง ในกรณีนี้sudoกำลังขอรหัสผ่าน แต่มีการถามในพื้นหลังดังนั้นคุณจะไม่เห็นข้อเท็จจริงนี้ หากต้องการดูมันคุณควรนำงานกลับมาทำงานเบื้องหน้าโดยใช้fgคำสั่ง:

radu@Radu: ~ $ sudo emacs tet.c &
[1] 7732
radu@Radu: ~ $ # now sudo emacs run in background so you can't see nothing about what's happening
radu@Radu: ~ $ fg
[sudo] password for radu:

หลังจากนี้คุณสามารถพิมพ์Ctrl+ Zเพื่อให้งานอยู่ในพื้นหลังได้อีกครั้งหากคุณต้องการ จากนั้นคุณสามารถเรียกใช้คำสั่ง 'fg' อีกครั้งเพื่อนำงานกลับมาใช้ในเบื้องหน้าเป็นต้น


สำหรับฉันมันเสมอ telnet ฉันลืมquit:) (ดูsuperuser.com/questions/486496/how-do-i-exit-telnet )
cmroanirgo

1
ดังนั้นฉันกด Ctrl + d สองครั้ง (!) และได้รับข้อความเดียวกันหลังจากข้อความแรก มีวิธีใดที่จะคิดออกว่างานที่ฉันเพิ่งฆ่าไปคืออะไร?
Matsmath

19

คุณได้รับข้อความเนื่องจากระบบเตือนคุณเกี่ยวกับงานที่เกี่ยวข้องกับเชลล์ปัจจุบันของคุณ

คุณสามารถแสดงรายการเหล่านี้ทำงาน / หยุดงานโดยการทำงาน: jobs,

จากนั้นคุณสามารถเลือกทำอย่างใดอย่างหนึ่งต่อไปนี้:

  • ย้ายงานล่าสุดไปยังเบื้องหน้าโดย: fg(ตรงข้ามbgกับพื้นหลัง),
  • วิ่งdisownเพื่อลบงานเหล่านี้ออกจากเชลล์ปัจจุบันของคุณโดยไม่ฆ่ามัน
  • บังคับให้ออกจากระบบโดยการฆ่าภารกิจเหล่านี้โดยกดCtrl+Dสองครั้งเหมือนกับการพิมพ์exit/ logoutสองครั้ง
  • ฆ่างานเหล่านี้ด้วยตนเองโดยเรียกใช้: kill $(jobs -p)(เพิ่ม-9แรง)
  • หากคุณปฏิเสธพวกเขาและคุณยังต้องการฆ่ากระบวนการที่หยุดทั้งหมดลอง:

    kill $(ps wuax | awk 'NR>1 && $8 ~ "T" {print $2}')


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

ในกรณีนี้คุณมี 3 วิธีดังนี้:

  • เรียกใช้คำสั่งโดยไม่เข้าไปในพื้นหลัง ( &)
  • อ่านรหัสผ่านจากอินพุตมาตรฐานแทนอุปกรณ์ปลายทางโดยsudo -Sเช่น

    echo mypass | sudo emacs tet.c
    
  • กำหนดค่า sudo เพื่อไม่ถามรหัสผ่านโดย: visudoคำสั่งและแก้ไขsudoersไฟล์ ดู: เปิดใช้งานNOPASSWDสำหรับผู้ใช้


6

เมื่อคุณพบว่ามีข้อผิดพลาดที่หยุดงาน :

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