ฉันจะวางกระบวนการ linux ที่กำลังทำงานอยู่ในพื้นหลังได้อย่างไร [ปิด]


112

ฉันมีคำสั่งที่อัปโหลดไฟล์โดยใช้ git ไปยังเซิร์ฟเวอร์ระยะไกลจาก Linux shell และจะใช้เวลาหลายชั่วโมงจึงจะเสร็จสิ้น

ฉันจะวางโปรแกรมที่กำลังทำงานอยู่ในพื้นหลังได้อย่างไร? เพื่อให้ฉันยังสามารถทำงานกับเชลล์ได้และกระบวนการนั้นก็เสร็จสมบูรณ์เช่นกัน?


แค่เดา ​​แต่คุณลอง ctrl + z หรือเรียกใช้คำสั่งของคุณแบบนี้ #command &
EralpB

คำสั่งกำลังทำงานอยู่แล้วดังนั้นฉันจึงไม่มีตัวเลือกอื่น ฉันไม่แน่ใจว่าควรลองใช้คำสั่งใด ฉันไม่ต้องการทำลายกระบวนการปัจจุบันดังนั้นฉันจึงไม่ได้ทดลอง
Mirage

เราควรรอคำตอบที่เป็นมืออาชีพมากกว่านี้ :) ฉันหมายถึงถ้าคุณมีโอกาสเริ่มต้นใหม่ทั้งหมด (The command & thing)
EralpB

ผู้ตอบคำถามที่ได้รับการยอมรับจะอธิบายถึงสามขั้นตอนที่ต้องดำเนินการ: stackoverflow.com/questions/625409/…
Leonard Saers

คุณยังสามารถเปิดอินสแตนซ์ที่สองของผงสำหรับอุดรูและเชื่อมต่อกับเซิร์ฟเวอร์อีกครั้งเพื่อรับเชลล์อื่น แม้ว่าการแก้ปัญหาctrl+zจะดีมาก
Ela782

คำตอบ:


208

ระงับกระบวนการด้วย CTRL + Z จากนั้นใช้คำสั่งbgเพื่อดำเนินการต่อในพื้นหลัง ตัวอย่างเช่น:

sleep 60
^Z  #Suspend character shown after hitting CTRL+Z
[1]+  Stopped  sleep 60  #Message showing stopped process info
bg  #Resume current job (last job stopped)

ข้อมูลเพิ่มเติมเกี่ยวกับการควบคุมงานและbgการใช้งานในbashหน้าคู่มือ:

JOB CONTROL การ
พิมพ์อักขระSuspend (โดยทั่วไปคือ ^ Z, Control-Z) ในขณะที่กระบวนการกำลังทำงานทำให้กระบวนการนั้นหยุดทำงานและส่งคืนการควบคุมเพื่อทุบตี [... ] จากนั้นผู้ใช้อาจปรับเปลี่ยนสถานะของงานนี้โดยใช้คำสั่ง bg เพื่อดำเนินการต่อในพื้นหลัง [... ] A ^ Z จะมีผลทันทีและมีผลข้างเคียงเพิ่มเติมในการทำให้เอาต์พุตและตัวพิมพ์ที่รอดำเนินการถูกทิ้ง

bg [ jobspec ... ]
ดำเนินการต่อแต่ละjobspec ที่ถูกระงับในพื้นหลังราวกับว่ามันเริ่มต้นด้วย &. ถ้า jobspecไม่อยู่ในความคิดของเปลือกของงานปัจจุบันถูกนำมาใช้

แก้ไข

เพื่อเริ่มกระบวนการที่คุณสามารถฆ่าเทอร์มินัลได้และยังคงทำงานอยู่

nohup [command] [-args] > [filename] 2>&1 &

เช่น

nohup /home/edheal/myprog -arg1 -arg2 > /home/edheal/output.txt 2>&1 &

หากต้องการละเว้นเอาต์พุต (ไม่ฉลาดมาก) ให้เปลี่ยนชื่อไฟล์เป็น /dev/null

หากต้องการรับข้อความแสดงข้อผิดพลาดที่ตั้งค่าเป็นไฟล์อื่นให้เปลี่ยน&1เป็นชื่อไฟล์

นอกจากนี้: คุณสามารถใช้jobsคำสั่งเพื่อดูรายการที่จัดทำดัชนีของกระบวนการพื้นหลังเหล่านั้น และคุณสามารถฆ่ากระบวนการที่อยู่เบื้องหลังได้โดยการเรียกใช้kill %1หรือkill %2โดยให้ตัวเลขเป็นดัชนีของกระบวนการ


ฉันลองแล้ว แต่เมื่อมันส่งออกบางสิ่งบางอย่างมันมาที่เบื้องหน้าอีกครั้งพร้อมกับ% ที่แสดงจำนวนข้อมูลที่อัปโหลด
มิราจ

กระบวนการจะเขียนเอาต์พุตใด ๆ ไปยังเทอร์มินัลตามที่คุณสั่งให้กระบวนการทำในตอนเริ่มต้น คุณจะต้องรีสตาร์ทเพื่อรับเอาต์พุตเพื่อเขียนลงไฟล์หรือ/dev/null. ดูแก้ไขด้านบน
Ed Heal

ดังนั้นหมายความว่าหากกระบวนการเริ่มต้นแล้วจะไม่มีทางเปลี่ยนเส้นทาง ouput
Mirage

ใช่แน่นอน. คุณไม่สามารถทำให้กระบวนการมีผลเฉพาะเชลล์ที่กำลังเรียกใช้ คุณสามารถทำkill -9 <pid of your shellและจากนั้นกระบวนการจะยังคงทำงานและเอาต์พุตจะถูกทิ้งไป - แต่คุณจะต้องเข้าสู่ระบบอีกครั้งเพื่อเริ่มเชลล์ใหม่
Ed Heal

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