timeout


1. คำสั่ง timeout คืออะไร และหน้าที่หลัก

ในฐานะผู้เชี่ยวชาญด้านระบบ Linux การเขียน Shell Script ที่มีประสิทธิภาพและเสถียรภาพเป็นสิ่งสำคัญอย่างยิ่ง แต่บ่อยครั้งที่สคริปต์ของเราต้องเรียกใช้คำสั่งภายนอก (External Commands) หรือบริการเครือข่าย ซึ่งบางครั้งอาจเกิดภาวะ “Hang” หรือทำงานช้ากว่าที่คาดการณ์ไว้จนทำให้สคริปต์ทั้งหมดหยุดรอ (Blocking) ทำให้ระบบโดยรวมติดขัด

timeout คือคำสั่งยูทิลิตี้ของ Linux ที่ถูกออกแบบมาเพื่อแก้ไขปัญหาดังกล่าว หน้าที่หลักของมันคือการจำกัดระยะเวลาสูงสุดในการรันคำสั่งใดๆ เมื่อเวลาที่กำหนดหมดลง timeout จะส่งสัญญาณ (Signal) ไปยังกระบวนการที่กำลังทำงานอยู่ เพื่อบังคับให้หยุดทำงานทันที ไม่ว่าคำสั่งนั้นจะติดอยู่ในลูปไม่รู้จบ หรือรอการตอบกลับจากเครือข่ายนานเกินไปก็ตาม

หลักการทำงาน: timeout ทำหน้าที่เป็นตัวห่อหุ้ม (Wrapper) รอบๆ คำสั่งเป้าหมาย โดยมันจะเฝ้าจับเวลาตั้งแต่เริ่มรันคำสั่ง หากถึงขีดจำกัดเวลาที่กำหนด มันจะส่งสัญญาณ Kill (โดยค่าเริ่มต้นคือ SIGTERM ตามด้วย SIGKILL หากจำเป็น) เพื่อยุติกระบวนการนั้นอย่างเด็ดขาด ทำให้สคริปต์หลักสามารถดำเนินการต่อไปได้อย่างราบรื่น


2. ไวยากรณ์ (Syntax) และพารามิเตอร์สำคัญ

timeout [OPTION]... COMMAND [ARG...]
  • -s : กำหนดสัญญาณที่จะส่งเมื่อหมดเวลา (เช่น SIGKILL, SIGTERM) ค่าเริ่มต้นคือ SIGTERM ซึ่งเป็นวิธีที่สุภาพกว่าในการขอให้โปรแกรมหยุดทำงาน
  • -k : กำหนดสัญญาณที่จะส่งเมื่อหมดเวลา หากต้องการบังคับปิดทันที ควรใช้ SIGKILL (แต่ควรเป็นทางเลือกสุดท้าย)
  • -t : ตัวกำหนดระยะเวลาสูงสุดที่อนุญาตให้คำสั่งทำงานได้ หน่วยคือวินาที (Seconds) นี่คือพารามิเตอร์ที่ใช้บ่อยที่สุด

3. ตัวอย่างการใช้งานจริง (Code Examples & Use Cases)

timeout มีประโยชน์สูงสุดในการจัดการกับคำสั่งที่เกี่ยวข้องกับการเครือข่าย (Network Calls), การประมวลผลไฟล์ขนาดใหญ่, หรือสคริปต์ที่มีการรอ I/O (Input/Output) ที่ไม่แน่นอน


Use Case 1: จำกัดเวลาการเชื่อมต่อ API

สมมติว่าคุณกำลังเรียกใช้ API จากภายนอก และต้องการให้แน่ใจว่าสคริปต์จะไม่ติดอยู่กับการรอ Timeout ของเครือข่ายที่นานเกินไป การกำหนดเวลาเพียง 5 วินาทีจะช่วยป้องกันปัญหานี้

# รันคำสั่ง curl เพื่อดึงข้อมูล API แต่จำกัดเวลาให้เหลือแค่ 5 วินาที
timeout 5s curl -s "https://api.example.com/data"

Use Case 2: การป้องกันสคริปต์ Hang

หากคุณรันคำสั่งที่รู้ว่าอาจจะติดขัด (เช่น คำสั่งประมวลผลไฟล์ขนาดใหญ่) คุณสามารถใช้ timeout เพื่อให้แน่ใจว่ามันจะไม่กินทรัพยากรระบบไปตลอดกาล

# รันสคริปต์ประมวลผลข้อมูล (process_data.sh) แต่จำกัดเวลาแค่ 30 วินาที
timeout 30s ./process_data.sh arg1

4. ข้อควรระวังและ Best Practices

  • การจัดการ Signal (Signal Handling): เมื่อ timeout หมดเวลา มันจะส่งสัญญาณตามที่กำหนด หากโปรแกรมเป้าหมายไม่ได้ถูกออกแบบมาให้รับมือกับ SIGTERM อย่างถูกต้อง การใช้ SIGKILL อาจทำให้ข้อมูลเสียหายได้ ควรพยายามใช้ค่าเริ่มต้น (SIGTERM) ก่อนเสมอ
  • การตรวจสอบ Exit Status: เมื่อคำสั่งถูกยุติด้วยเวลาหมดอายุ (Timeout) คำสั่ง timeout จะส่งคืนสถานะความล้มเหลวที่เฉพาะเจาะจง ซึ่งคุณสามารถนำไปใช้ในการควบคุม Flow ของสคริปต์หลักได้

Best Practice: ควรใช้ timeout เสมอเมื่อเรียกใช้คำสั่งภายนอกที่เกี่ยวข้องกับเครือข่าย (Network I/O) หรือการประมวลผลข้อมูลที่ไม่สามารถรับประกันระยะเวลาในการทำงานได้ การจำกัดเวลานี้ไม่เพียงแต่เพิ่มความเสถียรของสคริปต์เท่านั้น แต่ยังช่วยป้องกันไม่ให้กระบวนการที่ผิดพลาดกินทรัพยากร CPU และ Memory ของระบบไปอย่างไม่มีขีดจำกัดอีกด้วย