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