Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม Bash

รันคำสั่ง Linux ในพื้นหลัง – คู่มือสำหรับ Ubuntu & SSH

บทความนี้จะแสดงวิธีรันคำสั่งในพื้นหลังของ 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 

…ยืนยันว่าคำสั่งกำลังรันในพื้นหลังแล้ว