บทความนี้จะแสดงวิธีเรียกใช้คำสั่งในพื้นหลังเชลล์ของ Linux (รวมถึง Ubuntu) ซึ่งมีประโยชน์เมื่อต้องทำงานจากระยะไกลผ่าน SSH
สมมติว่าคุณเชื่อมต่อจากระยะไกลผ่าน SSH กับคอมพิวเตอร์ระยะไกล และคุณต้องการทำงานที่ใช้เวลานาน
ในขณะที่งานกำลังทำงาน โดยปกติ คุณจะต้องเปิดการเชื่อมต่อโดยเปิดหน้าต่างเทอร์มินัลไว้ อย่างไรก็ตาม นี่อาจเป็นเรื่องยุ่งยากหากคุณต้องการปิดหน้าต่างเพื่อทำงานอื่น หรือหากคุณมีการเชื่อมต่ออินเทอร์เน็ตที่ไม่แน่นอนซึ่งอาจทำให้การเชื่อมต่อหยุดชะงัก
หากปิดหน้าต่างหรือขาดการเชื่อมต่อ คำสั่งอาจหยุดทำงานบนคอมพิวเตอร์ระยะไกล
การเรียกใช้คำสั่งในเบื้องหลังสามารถหลีกเลี่ยงได้ – คำสั่งจะทำงานต่อไปไม่ว่าการเชื่อมต่อ/เซสชันจะยังคงเปิดอยู่หรือไม่
การส่งคำสั่งให้ทำงานในเบื้องหลังยังมีประโยชน์ในสคริปต์ หากคุณต้องการรันคำสั่งแต่ไม่ต้องการรอให้เสร็จสิ้นและไม่ต้องการเอาต์พุตในสคริปต์ของคุณในภายหลัง
การใช้ & เพื่อเรียกใช้คำสั่งในเบื้องหลัง
การเรียกใช้คำสั่งในพื้นหลังใน Linux นั้นง่ายมาก – เพิ่ม & อักขระต่อท้ายคำสั่งของคุณ:
your_command_here &
ตัวอย่างเช่น คำสั่งต่อไปนี้จะบีบอัดไฟล์คู่หนึ่ง - คำสั่งจะทำงานในเบื้องหลัง ดังนั้นคุณจึงไม่ต้องรอให้เสร็จก่อนที่จะรันคำสั่งอื่น:
zip archive.zip file1 file2 &
ง่าย! ผลลัพธ์จะมีลักษณะดังนี้:
[1] 3001
…ระบุงาน ( ในกรณีนี้ [1] ) และ ID กระบวนการ (ในกรณีนี้ 3001 ) ของคำสั่งที่กำลังดำเนินการในพื้นหลัง
เมื่องานเสร็จสมบูรณ์ (หรือล้มเหลว ) สถานะของงานจะถูกส่งออก:
[1] + done zip archive.zip file1 file2
ซ่อนผลลัพธ์ของงานเบื้องหลัง
เอาต์พุตจากคำสั่งจะถูกพิมพ์ไปยังเทอร์มินัลต่อไปในขณะที่กำลังทำงานในพื้นหลัง
หากคุณต้องการซ่อนสิ่งนี้ไว้ (เช่น มันรบกวนการทำงานอื่นๆ ของคุณ) คุณสามารถระงับเอาต์พุตได้โดยใช้การเปลี่ยนเส้นทางมาตรฐาน
your_command > /dev/null 2>&1 &
- ข้างบน > กำลังเปลี่ยนเส้นทาง STDOUT (เอาต์พุตมาตรฐาน) ของคำสั่งไปที่ /dev/null .
- STDERROR (เอาต์พุตข้อผิดพลาดมาตรฐาน) ของคำสั่งถูกเปลี่ยนเส้นทางไปยัง STDOUT โดยใช้ 2>&! เพื่อให้ STDERR ไปที่ /dev/null เช่นกัน
- /dev/null หมายถึงเอาต์พุตไปไหน หายไป ซ่อนเร้น ไม่มีอะไรเลย
แสดงรายการงานเบื้องหลังการทำงาน
ใช้งาน คำสั่งแสดงรายการงานพื้นหลังที่กำลังทำงานอยู่:
jobs -l
มันจะแสดงรายการงานพื้นหลังที่ทำงานอยู่ – แต่ละรายการจะมีลักษณะดังนี้:
[1] + 3601 running ping 8.8.8.8 > /dev/null 2>&1
ด้านบน คุณจะเห็นคำสั่ง ping 8.8.8.8> /dev/null 2>&1 กำลังทำงานในพื้นหลังโดยมีรหัสงาน 1 และรหัสกระบวนการ 3601
หยุดงานเบื้องหลัง
การ ฆ่า คำสั่งหยุดงาน:
kill 3601
… ใส่ รหัสกระบวนการ ของงานเบื้องหลัง และจะหยุด (ฆ่า) มัน
ทำให้งานพื้นหลังทำงานต่อไป แม้ว่าเซสชันจะถูกขัดจังหวะ
นี่อาจเป็นบิตที่มีประโยชน์ที่สุด
หากต้องการให้คำสั่งทำงานต่อไป แม้ว่าคุณจะปิดหน้าต่างหรือการเชื่อมต่อหลุด หรือเซสชันถูกขัดจังหวะ คุณจะต้องปิดงานพื้นหลังโดยใช้คำสั่ง disown
disown %1
ด้านบน งานพื้นหลังที่มีรหัสงาน 1 ถูกปฏิเสธ มันถูกตัดการเชื่อมต่อจากเชลล์ปัจจุบันและจะทำงานต่อไปจนกว่าจะเสร็จสิ้นหรือพบข้อผิดพลาดหรือถูกฆ่าโดยใช้คำสั่ง KILL
ดูบทความนี้เพื่อดูวิธีแสดงรายการกระบวนการที่ทำงานอยู่ทั้งหมด – คุณอาจจำเป็นต้องใช้หากต้องการติดตามงานที่คุณปฏิเสธ .
การย้ายคำสั่งการวิ่งไปที่พื้นหลัง
หากต้องการย้ายคำสั่งที่กำลังรันไปที่พื้นหลัง คุณต้องระงับคำสั่งนั้นไว้ชั่วคราว จากนั้นย้ายคำสั่งไปที่พื้นหลัง
เมื่อต้องการทำสิ่งนี้ ในขณะที่คำสั่งกำลังทำงานอยู่ ให้กด CTRL + Z . คุณจะเห็นบางอย่างเช่น:
suspended command_name
…ยืนยันว่าคำสั่งถูกระงับ
จากนั้นป้อน bg คำสั่งให้รันคำสั่งต่อไปในเบื้องหลัง:
bg
คุณจะเห็นบางอย่างเช่น
continued command_name
…ยืนยันว่าคำสั่งกำลังทำงานอยู่ในเบื้องหลัง