1. คำสั่ง mkfifo คืออะไร และหน้าที่หลัก
ในโลกของระบบปฏิบัติการ Linux การสื่อสารระหว่างกระบวนการ (Inter-Process Communication – IPC) เป็นหัวใจสำคัญของการทำงานอัตโนมัติและสคริปต์ที่ซับซ้อน คำสั่ง mkfifo ย่อมาจาก “make FIFO” ซึ่งใช้สำหรับสร้างไฟล์พิเศษประเภทหนึ่งที่เรียกว่า **Named Pipe** หรือ **FIFO (First-In, First-Out)**
หลักการทำงาน: โดยปกติแล้ว การส่งข้อมูลระหว่างโปรแกรมจะทำผ่าน Standard Input/Output (|) ซึ่งเป็น pipe ชั่วคราวที่ระบบจัดการให้ แต่เมื่อเราต้องการให้กระบวนการ A และกระบวนการ B ที่รันแยกกันและไม่เกี่ยวข้องกันโดยตรงสามารถแลกเปลี่ยนข้อมูลได้เหมือนกับการสื่อสารผ่านท่อจริง ๆ เราต้องใช้ Named Pipe
- Named Pipe (FIFO): คือไฟล์เสมือนที่ทำหน้าที่เป็นช่องทางในการไหลของข้อมูล เมื่อโปรแกรมหนึ่งเขียนข้อมูลลงใน FIFO อีกโปรแกรมหนึ่งที่กำลังรออ่านอยู่จะสามารถรับข้อมูลนั้นไปได้ทันที
- ความแตกต่างจาก Pipe ทั่วไป: Pipe ทั่วไป (
|) จะมีขอบเขตจำกัดอยู่ใน Shell Session เดียว แต่ FIFO ที่สร้างด้วยmkfifoจะคงอยู่บนระบบไฟล์และสามารถถูกเข้าถึงโดยกระบวนการใด ๆ ก็ได้ที่ทราบชื่อของมัน
2. ไวยากรณ์ (Syntax) และพารามิเตอร์สำคัญ
mkfifo [OPTION]... [FILE]...
- -m mode: กำหนดสิทธิ์ (Permissions) ของไฟล์ FIFO ที่สร้างขึ้น เช่น
mkfifo mypipe --mode=0666 - FILE…: ชื่อของ Named Pipe ที่ต้องการสร้าง (เช่น
data_stream)
ข้อควรจำ: หากไฟล์ชื่อ FIFO นั้นมีอยู่แล้ว การรันคำสั่ง mkfifo จะล้มเหลวด้วยข้อผิดพลาด (Error) ดังนั้นในการเขียนสคริปต์ ควรมีการตรวจสอบการมีอยู่ของไฟล์ก่อนเสมอ
3. ตัวอย่างการใช้งานจริง (Code Examples & Use Cases)
สถานการณ์ที่เหมาะสมที่สุดในการใช้ FIFO คือเมื่อเราต้องการให้โปรแกรมหลายตัวทำงานแบบ Asynchronous และสื่อสารกันโดยไม่จำเป็นต้องรันใน Shell เดียวกัน
- Use Case: Message Queue Simulation
ใช้ FIFO เป็นคิวกลางสำหรับระบบที่รับข้อมูลจากแหล่งภายนอก (เช่น Sensor Data) และให้ Worker Process หลายตัวมาอ่านและประมวลผล - Use Case: Decoupling Processes
เมื่อคุณมี Producer Process (ผู้ผลิตข้อมูล) และ Consumer Process (ผู้บริโภคข้อมูล) การใช้ FIFO จะช่วยให้ทั้งสองส่วนทำงานได้อย่างอิสระและไม่บล็อกการทำงานของกันและกัน
ตัวอย่างโค้ด (Simulation):
# 1. สร้าง FIFO ใน Background Shell Session หรือ Terminal ใหม่
mkfifo data_pipe &
# 2. เปิด Terminal ที่สอง (Consumer) เพื่อรอรับข้อมูล
echo "Waiting for data..."
cat data_pipe # คำสั่ง cat จะบล็อกการทำงานจนกว่าจะมีข้อมูลมาถึง
# 3. กลับมาที่ Terminal แรก (Producer) เพื่อส่งข้อมูล
(
sleep 1
echo "System Status: OK" > data_pipe # เขียนข้อมูลลงใน FIFO
sleep 2
echo "User Login Detected" > data_pipe
) &
4. ข้อควรระวังและ Best Practices
- การทำความสะอาด (Cleanup): FIFO เป็นไฟล์จริงบนระบบไฟล์ ดังนั้นเมื่อใช้งานเสร็จแล้ว ต้องใช้
rm data_pipeเพื่อลบออก มิฉะนั้นจะทำให้เกิดขยะในระบบไฟล์ - การจัดการสิทธิ์ (Permissions): ควรระมัดระวังเรื่องสิทธิ์ในการอ่าน/เขียน เนื่องจาก FIFO เป็นจุดรวมข้อมูลที่ทุกกระบวนการสามารถเข้าถึงได้
- การจัดการ Blocking: คำสั่งที่อ่านจาก FIFO (เช่น
cat) จะทำงานแบบบล็อก (Blocking) นั่นหมายความว่ามันจะหยุดรอจนกว่าจะมีข้อมูลมาถึง การออกแบบสคริปต์ต้องคำนึงถึงพฤติกรรมนี้
สรุปการประยุกต์ใช้สำหรับ SysAdmin/DevOps: mkfifo เป็นเครื่องมือที่ทรงพลังสำหรับการสร้างระบบ Message Queue อย่างง่าย (Lightweight MQ) หรือการจำลองท่อข้อมูลขนาดใหญ่ในสคริปต์ Bash ที่ซับซ้อน โดยเฉพาะอย่างยิ่งในการทำ CI/CD Pipeline ที่ต้องการให้หลายขั้นตอนทำงานแบบขนานและสื่อสารกันผ่านจุดกลาง