ไม่มีอะไรขย่าใจกว่ารันคำสั่งในเทอร์มินัลแล้วมันรันนานนับนาที บางครั้งนับชั่วโมง และไม่สามารถใช้เทอร์มินัลต่อได้ แน่นอนว่าสามารถใช้ tabs ได้ แต่เป็นวิธีที่ clunky และไม่ได้ optimal เสมอไป เพราะคุณอาจอยากดู updates ขณะทำงานอยู่ บทความนี้จะแสดงวิธีต่างๆ ในการรันคำสั่ง bash ในพื้นหลังบน Linux
จบคำสั่งด้วย &
หากต้องการส่งคำสั่งไปพื้นหลัง การใช้ & ท้ายคำสั่งเป็นวิธีง่ายๆ สามารถสั่งคำสั่งในพื้นหลังและใช้เทอร์มินัลต่อได้ขณะมันรัน แต่มีข้อติดคือ การใช้ & ไม่ได้ disconnect คำสั่งออกจากคุณ แค่ส่งไปพื้นหลัง หมายความว่าขณะคุณพยายามใช้เทอร์มินัล สิ่งที่คำสั่งส่งไป STDOUT หรือ STDERR จะยังพิมพ์ออกมา ซึ่งอาจรบกวน
COMMAND &
เมื่อปิดเทอร์มินัล session คำสั่งจะจบ สามารถ kill คำสั่งได้ด้วยคำสั่ง jobs หาหมายเลขคำสั่งที่รันอยู่ และ kill ด้วยคำสั่ง kill syntax ดังนี้:
kill %1
การใช้ & เหมาะหากต้องการส่งงานไปพักคราว แต่ไม่คาดว่าจะรันตลอดไป
& หลังคำสั่ง แล้ว disown It
การรันคำสั่งด้วยแค่ & ส่งไปหลังและรันต่อตราบเท่าที่หน้าต่างเทอร์มินัลเปิดอยู่ แต่หากต้องการให้คำสั่งรันตลอดไปแม้ session เทอร์มินัลจบ สามารถใช้คำสั่ง disown
เริ่มด้วยการเพิ่ม &:
COMMAND &
какกล่าวมา & ส่งคำสั่งไปพื้นหลังแต่ไม่ detach จาก user สามารถตรวจสอบได้ด้วยคำสั่ง jobs จะแสดงคำสั่งที่รันในพื้นหลัง
พิมพ์ disown ลงใน shell มันจะทำหน้าที่นั้น (และตรวจสอบอีกครั้งด้วย jobs ได้)
ตอนนี้ปิดเทอร์มินัลและทำกิจกรรมอื่นต่อได้ มันจะยัง pipe ไป STDOUT หรือ STDERR แต่เมื่อออกและเปิดเทอร์มินัลใหม่ จะไม่เห็นอะไร หาคำสั่งได้อีกด้วย top หรือ ps และ kill ด้วย kill
& หลังคำสั่ง พร้อม /dev/null
การเพิ่ม & หลังคำสั่งส่งไปพื้นหลัง แต่คำสั่งในพื้นหลังจะยังพิมพ์ข้อความเข้ามาในเทอร์มินัลขณะคุณใช้งาน หากต้องการป้องกัน ให้ redirect คำสั่งไป /dev/null
COMMAND &>/dev/null &
สิ่งนี้ไม่ป้องกันไม่ให้คำสั่งจบเมื่อเทอร์มินัลปิด แต่какกล่าวมา สามารถใช้ disown เพื่อ disown คำสั่งที่รันอยู่ออกจาก user ได้ สามารถ kill ด้วยวิธีข้างต้นได้หากไม่ต้องการให้รันต่อ
Nohup พร้อม & และ /dev/null
ต่างจากคำสั่งก่อนหน้า nohup อนุญาตให้รันคำสั่งในพื้นหลังและคงการทำงานไว้ ทำไม? nohup bypass สัญญาณ HUP (signal hang up) ทำให้รันคำสั่งในพื้นหลังได้แม้เทอร์มินัลจะปิด รวมคำสั่งนี้กับการ redirect ไป " /dev/null " (เพื่อป้องกันไม่ให้ nohup สร้างไฟล์ nohup.out) ทุกอย่างจะไปพื้นหลังด้วยคำสั่งเดียว
nohup COMMAND &>/dev/null &
โปรแกรมเทอร์มินัลบน Linux ปัจจุบันส่วนใหญ่มีฟีเจอร์ built-in ให้รันในพื้นหลังได้ง่าย รวมถึง modern init systems (อย่าง systemd) อนุญาตให้เริ่มโปรแกรมแบบ services ตอน boot หรือเมื่อไหร่ก็ได้
ยังมีโปรแกรมบน Linux บางตัวขาดความสามารถในการรันเป็น daemon หรือผสานกับ modern init systems นี่เป็นความไม่สะดวกจริงๆ แต่เข้าใจได้ เพราะไม่ใช่นักพัฒนาทุกคนมี skill หรือเวลาเพิ่มฟีเจอร์ใหม่
โชคดีที่คำสั่งอย่าง nohup หรือ disown ยังคงมีอยู่และช่วยปิดช่องว่างในการย้ายโปรแกรมแบบนี้ไปพื้นหลังได้ พวกมันไม่ได้ perfect หรือ fancy แต่ทำงานได้เมื่อจำเป็น
ถ้าชอบบทความ Linux นี้ อย่าลืมดูเนื้อหา Linux อื่นๆ ของเรา เช่น วิธีเชื่อมต่อ Google account กับ GNOME Shell, Linux distros ที่ดีที่สุดสำหรับผู้ใช้ Windows, และคำสั่ง LS ที่ควรรู้