Background Processes และ Job Control

เมื่อรันคำสั่งที่ใช้เวลานานบน Terminal คำสั่งนั้นจะ Block Shell ไว้จนกว่าจะเสร็จ Linux มีระบบ Job Control ที่ช่วยให้รันหลาย Process พร้อมกัน สลับระหว่าง Background และ Foreground ได้ รวมถึงเครื่องมืออย่าง nohup และ screen/tmux ที่ทำให้ Job ทำงานต่อได้แม้ปิด Terminal หรือ SSH Session หลุด

บทความนี้อธิบาย Job Control พื้นฐาน (fg, bg, jobs), การใช้ nohup และ disown เพื่อ Detach Process จาก Terminal รวมถึง screen และ tmux สำหรับ Persistent Terminal Sessions บน Server

Background และ Foreground Process

Linux Shell แยก Process ออกเป็นสองประเภทตามสถานะ Foreground คือ Process ที่ควบคุม Terminal อยู่ ส่วน Background คือ Process ที่ทำงานอยู่เบื้องหลังโดยไม่ Block Shell

# รัน Command ใน Background ด้วย &
./long-task.sh &
# Output: [1] 12345   (Job number=1, PID=12345)

# รัน Command ใน Foreground ปกติ
./long-task.sh
# Shell จะ Block จนกว่า Task จะเสร็จ

# กด Ctrl+Z เพื่อ Suspend (หยุดชั่วคราว) Foreground Job
./long-task.sh
^Z
# Output: [1]+  Stopped   ./long-task.sh

# ส่ง Suspended Job ไป Background
bg %1     # ส่ง Job number 1 ไป Background
bg        # ส่ง Job ล่าสุดไป Background

jobs — ดูรายการ Job

# ดูรายการ Job ทั้งหมด
jobs

# ดูพร้อม PID
jobs -l

# ตัวอย่าง output
# [1]   Running    ./backup.sh &
# [2]-  Stopped    ./long-task.sh
# [3]+  Running    python3 script.py &
# + = Current job (ล่าสุดที่ใช้งาน)
# - = Previous job

fg — นำ Job กลับสู่ Foreground

# นำ Job กลับมาเป็น Foreground
fg %1     # Job number 1
fg %2     # Job number 2
fg        # Job ล่าสุด (+ job)

# ค้นหา Job ตามชื่อ
fg %backup   # Job ที่มีชื่อขึ้นต้นด้วย backup

# ตัวอย่างการทำงาน
./backup.sh &     # รันใน Background
jobs              # ดูรายการ
fg %1             # นำกลับมา Foreground
^Z                # Suspend อีกครั้ง
bg                # ส่งกลับ Background

nohup — รัน Job แม้ปิด Terminal

เมื่อ Terminal ปิดหรือ SSH Session หลุด Shell จะส่ง SIGHUP ให้ทุก Process ในนั้น ทำให้ Job หยุดทำงาน nohup ป้องกันไม่ให้ Process รับ SIGHUP ทำให้ทำงานต่อได้แม้ Session สิ้นสุด

# รัน Command แบบ nohup
nohup ./long-task.sh &

# nohup จะ Redirect Output ไปที่ nohup.out โดยอัตโนมัติ
# ถ้าต้องการระบุไฟล์ Output:
nohup ./long-task.sh > /var/log/task.log 2>&1 &

# ดู Output ของ nohup
tail -f nohup.out
tail -f /var/log/task.log

# ตรวจสอบว่า Process ยังทำงานอยู่
ps -p [PID]
jobs   # (ไม่แสดง nohup jobs หลังปิด terminal)

disown — Detach Job จาก Shell

disown ใช้กับ Job ที่รันอยู่แล้วใน Background เพื่อถอดออกจาก Shell’s Job Table ทำให้ Shell ไม่ส่ง SIGHUP ให้เมื่อ Session ปิด เหมาะเมื่อลืมใช้ nohup ตั้งแต่ต้น

# รัน Job ใน Background ก่อน
./long-task.sh &
# [1] 12345

# disown Job จาก Shell (Job จะไม่ได้รับ SIGHUP เมื่อ Shell ปิด)
disown %1         # disown Job number 1
disown -a         # disown ทุก Job
disown 12345      # disown ด้วย PID

# ดูว่า Job ถูก disown แล้ว
jobs              # Job จะหายจากรายการ

# Process ยังทำงานอยู่ ตรวจสอบด้วย
ps -p 12345

screen — Persistent Terminal Session

screen สร้าง Virtual Terminal ที่ทำงานอิสระจาก SSH Session สามารถ Detach และ Reattach ได้ เหมาะสำหรับงานที่ใช้เวลานานบน Remote Server

# ติดตั้ง screen
sudo apt install screen    # Ubuntu/Debian
sudo dnf install screen    # RHEL/Rocky

# เปิด screen session ใหม่
screen

# เปิดพร้อมตั้งชื่อ Session
screen -S backup-job

# คำสั่งสำคัญใน screen (ใช้ Ctrl+A เป็น Prefix)
Ctrl+A, D     — Detach (ออกจาก screen โดยให้ทำงานต่อ)
Ctrl+A, C     — สร้าง Window ใหม่
Ctrl+A, N     — ไป Window ถัดไป
Ctrl+A, P     — ไป Window ก่อนหน้า
Ctrl+A, "     — รายการ Window ทั้งหมด
Ctrl+A, K     — Kill Window ปัจจุบัน

# ดูรายการ screen sessions
screen -ls

# Reattach กลับเข้า Session
screen -r              # ถ้ามี Session เดียว
screen -r backup-job   # ระบุชื่อ
screen -r 12345        # ระบุ PID

tmux — Terminal Multiplexer สมัยใหม่

tmux ทำงานคล้าย screen แต่มีฟีเจอร์เพิ่มเติมคือ Split Pane, Status Bar, และ Configuration ที่ยืดหยุ่นกว่า เหมาะสำหรับ Developer และ System Administrator ที่ต้องการ Terminal หลายหน้าต่างพร้อมกัน

# ติดตั้ง tmux
sudo apt install tmux    # Ubuntu/Debian
sudo dnf install tmux    # RHEL/Rocky

# เปิด tmux session ใหม่
tmux

# เปิดพร้อมตั้งชื่อ
tmux new-session -s deploy

# คำสั่งสำคัญใน tmux (ใช้ Ctrl+B เป็น Prefix)
Ctrl+B, D     — Detach Session
Ctrl+B, C     — สร้าง Window ใหม่
Ctrl+B, N     — ไป Window ถัดไป
Ctrl+B, P     — ไป Window ก่อนหน้า
Ctrl+B, ,     — เปลี่ยนชื่อ Window
Ctrl+B, %     — Split แนวตั้ง (Vertical Pane)
Ctrl+B, "     — Split แนวนอน (Horizontal Pane)
Ctrl+B, ←→↑↓  — สลับระหว่าง Pane

# ดูรายการ sessions
tmux ls

# Attach กลับเข้า Session
tmux attach -t deploy
tmux a -t deploy   # Short form

เปรียบเทียบ nohup vs screen vs tmux

# nohup
# + ง่าย ไม่ต้องติดตั้งเพิ่ม
# + เหมาะสำหรับ Single Command ที่รันแล้วลืมได้
# - ไม่สามารถ Reattach เพื่อดู Output แบบ Interactive
# - ไม่มี Window Management

# screen
# + ติดตั้งง่าย มีในทุก Linux
# + Detach/Reattach ได้
# + หลาย Windows

# tmux
# + Split Pane (หลาย Terminal ในหน้าต่างเดียว)
# + Status Bar แสดงข้อมูล
# + Scripting / Configuration ยืดหยุ่นกว่า screen
# - ต้องติดตั้งเพิ่ม (มักไม่ติดมาบน Server)

สรุป

Linux Job Control ให้ความยืดหยุ่นในการจัดการ Process หลายตัวพร้อมกัน ใช้ & เพื่อรัน Background, Ctrl+Z เพื่อ Suspend, bg และ fg เพื่อสลับ, และ jobs เพื่อดูรายการ สำหรับงานที่ต้องทำงานต่อเมื่อ SSH Session ปิด ให้ใช้ nohup สำหรับ Single Command หรือ screen/tmux สำหรับ Interactive Session ที่ Reattach ได้

แนะนำบริการ DE

การใช้ nohup, screen หรือ tmux สำหรับ Long-running Tasks บน Remote Server ต้องการ SSH Access และสิทธิ์จัดการ Process เต็มรูปแบบ Cloud VPS ของ DE ให้ Root Access และ SSH Access เต็มรูปแบบ เหมาะสำหรับการรัน Deployment, Backup และ Data Processing Jobs ที่ใช้เวลานานบน Production Server

หากต้องการโฮสต์เว็บไซต์โดยไม่ต้องจัดการ Process เหล่านี้เอง Cloud Hosting ของ DE มีระบบจัดการ Background Tasks อัตโนมัติผ่าน Control Panel