เป็นไปได้หรือไม่ที่จะทำให้กระบวนการทำงานเบื้องหน้าเป็นพื้นหลังโดยไม่หยุดทำงาน (control + z)?


11

ฉันใช้งานแอพพลิเคชั่นที่รับแพ็คเก็ต TCP และ UDP ดังนั้นจึงไม่สามารถระงับได้ ฉัน intially วิ่ง 3 &กระบวนการของโปรแกรมเดียวกันกับการขัดแย้งที่แตกต่างกันในโหมดพื้นหลังใช้ เมื่อฉันทำเท่านั้น$fgกระบวนการทั้งสามเข้ามาอยู่เบื้องหน้า ตอนนี้ฉันต้องการส่งพวกเขาเป็นพื้นหลังอีกครั้ง แต่ไม่มีการระงับ ฉันจะทำสิ่งนั้นได้อย่างไร


นี่คือหัวข้อ ServerFault เกี่ยวกับการย้ายกระบวนการทำงานไปยังอินสแตนซ์หน้าจอใหม่ -> serverfault.com/questions/55880/…
Alan Barber

คำตอบ:


10

สิ่งแรกสิ่งแรก: มีเพียงกระบวนการเดียวในเบื้องหน้าไม่ใช่ทั้งสามกระบวนการ fgนำกระบวนการล่าสุดมาสู่เบื้องหน้า ในการทำให้กระบวนการของCtrl+ zจากนั้นพิมพ์bgเร็วขึ้นเพื่อไม่ให้ "รบกวน" แอปพลิเคชันที่เป็นปัญหา (โปรดทราบว่าตัวจัดกำหนดการกระบวนการจะทำเช่นนี้หลายครั้งต่อวินาที) ค้นหา PID ของกระบวนการในเบื้องหน้าจากนั้นในเทอร์มินัลตัวที่สอง / เซสชัน SSH ใช้

kill -SIGSTOP »pid« ; kill -SIGCONT »pid«

เทอร์มินัลดั้งเดิมของคุณจะพูดstoppedแต่เมื่อคุณส่งSIGCONTออกไปทันทีกระบวนการจะทำงานในพื้นหลังต่อไป


1
@stefen: โซลูชันของคุณน่าเชื่อถือ มันจะไม่ทำให้กระบวนการของฉันเสียหาย แต่อย่างใดโดยสมมติว่าถ้าเราระงับกระบวนการแล้วการเชื่อมต่อซ็อกเก็ตที่จัดตั้งขึ้นจะไม่หยุดชะงัก จะแก้ไขข้อบกพร่องนี้และอัปเดต ขอบคุณมาก. ถ้า
rahul.deshmukhpatil

2

หากคุณมีงานพื้นหน้าจริงๆแล้วทุบตีรอให้งานเสร็จนั่นคือคำจำกัดความของงานเบื้องหน้าไม่มากก็น้อย หากทุบตียังคงมีการควบคุมของเครื่องตรวจสอบสิ่งที่เกิดขึ้นjobs -lเช่น:

$ ncat -kl -p 10111 &
[1] 13404
$ ncat -kl -p 10222 &
[2] 13405
$ ncat -kl -p 10333 &
[3] 13406
$ jobs -l
[1]  13404 Running                 ncat -kl -p 10111 &
[2]- 13405 Running                 ncat -kl -p 10222 &
[3]+ 13406 Running                 ncat -kl -p 10333 &

ฉันเริ่มncatกระบวนการฟังพื้นหลังสามครั้งสำหรับสิ่งนี้ คุณอาจเห็น "เสร็จสิ้น" หรือ "หยุด" สำหรับสถานะงาน

คุณสามารถแบ็คกราวน์งานเบื้องหน้าได้อย่างมีประสิทธิภาพจากเชลล์ที่แตกต่างกันโดยใช้วิธีSIGSTOP / SIGCONT ของStefan Seidel (แม้ว่าสัญญาณจริงที่ส่งโดยเชลล์ด้วยCtrl- Zคือ SIGTSTP สัญญาณทั้งสองควรทำงาน)

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

กระบวนการทำงานหรือไปป์ไลน์ภายใต้การควบคุมของเชลล์เรียกว่า "งาน" เมื่อคุณใช้คำสั่งbgหรือfgคำสั่งคุณหมายถึงงานล่าสุดโดยนัย - ในกรณีของฉันงานที่มี+ในข้างต้น งานเหล่านี้สามารถเรียกได้อย่างชัดเจนว่าเป็น% 1% 2 หรือ% 3 (ตัวเลข[])

fgคำสั่งที่ไม่ผ่านการรับรองจะมีผลกับงานเดียวเท่านั้นซึ่งเป็นงานล่าสุดดังนั้นคุณอาจเข้าใจผิดเกี่ยวกับสถานการณ์ปัจจุบัน งานพื้นหลังอาจยังเขียนไปยังเทอร์มินัล:

  echo foo > /dev/tcp/127.0.0.1/10111

มันขึ้นอยู่กับว่าโปรแกรมจัดการกับเทอร์มินัลncatทำงานได้ดีสำหรับการเขียน สำหรับการอ่านว่าโปรแกรมจะหยุดการทำงานและคุณจะเห็นข้อความ "หยุด" เชลล์จะเริ่มต้นกระบวนการและรอให้พวกเขาออกหรือรับสัญญาณ SIGTTIN ( nohupเป็นวิธีแก้ไขปัญหานี้ตามที่เป็นอยู่disown)

คุณสามารถแบ็คกราวน์งานที่หยุดทำงานเฉพาะด้วย

$ bg %3

(ในกรณีของฉันฉันจะได้รับข้อผิดพลาดbash: bg: job 3 already in background)

มิฉะนั้นหากกระบวนการที่อยู่ในเบื้องหน้าเว้นแต่โปรแกรมจับ SIGTSTP และทำบางสิ่งที่พิเศษก็ไม่น่าจะมีปัญหากับการได้อย่างรวดเร็วCtrl- และZ bgไม่มีอะไรพิเศษเกี่ยวกับโปรแกรมเครือข่ายในแง่นี้การเชื่อมต่อ / ข้อมูลขาเข้าจะถูกบัฟเฟอร์โดยเคอร์เนล (มากถึงหนึ่งจุด) การเชื่อมต่อแบบสตรีมอาจมีการหยุดชั่วคราวที่สังเกตได้

ดูส่วน "การควบคุมงาน " ของหน้า bash man สำหรับรายละเอียดเพิ่มเติม


1

วิธีที่ง่ายที่สุดสำหรับคุณคือการใช้โปรแกรมหน้าจอ คุณสามารถเริ่มแอปพลิเคชันของคุณภายในเทอร์มินัลเสมือนจากนั้นออกจากหน้าจอด้วย Ctrl + A, D screen -xหากคุณต้องการที่จะกลับมาเซสชันของคุณชนิดของคุณ หากคุณมีหลายขั้นตอนคุณจะเห็นรายการหน้าจอเพื่อติดตั้งใหม่ สำหรับรายละเอียดเพิ่มเติมโปรดอ่านหน้าคนหน้าจอ


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