การดู : 0

12/04/2026 18:17น.

JS2GO EP.29 การจัดการ Signal และ Process ใน Go กับ JavaScript

JS2GO EP.29 การจัดการ Signal และ Process ใน Go กับ JavaScript

#Signal

#Process

#child process

#Go

#JavaScript

การจัดการ Signal และ Process เป็นหัวใจสำคัญสำหรับการควบคุม lifecycle ของแอปพลิเคชัน ไม่ว่าจะเป็นการหยุด server อย่างปลอดภัย, การ restart process, หรือการจัดการ background jobs ในบทความนี้เราจะเปรียบเทียบการจัดการ Signal และ Process ใน Go และ JavaScript (Node.js) พร้อมตัวอย่างโค้ดและแนวทางปฏิบัติที่เหมาะสม

 

1. การจัดการ Process และ Signal ใน Node.js (JavaScript)

 

Node.js มี module process และ child_process สำหรับจัดการ process และ signal

 

จับ Signal เช่น SIGINT หรือ SIGTERM

process.on('SIGINT', () => {
  console.log('Received SIGINT. Exiting gracefully...');
  process.exit(0);
});

process.on('SIGTERM', () => {
  console.log('Received SIGTERM. Cleaning up...');
  process.exit(0);
});

 

สร้าง Child Process

const { spawn } = require('child_process');

const ls = spawn('ls', ['-lh', '/usr']);

ls.stdout.on('data', (data) => {
  console.log(`stdout: ${data}`);
});

ls.stderr.on('data', (data) => {
  console.error(`stderr: ${data}`);
});

ls.on('close', (code) => {
  console.log(`Child process exited with code ${code}`);
});

 

ข้อดี Node.js

✔️ จับ signal และควบคุม process ได้ง่าย
✔️ รองรับ asynchronous process และ event-driven pattern

 

ข้อจำกัด

⚠️ ต้องใช้ event listener และ callback
⚠️ ต้องระวัง zombie process เมื่อ spawn child process

 

2. การจัดการ Process และ Signal ใน Go

 

Go มี package os และ os/signal สำหรับจัดการ process และ signal

 

จับ Signal เช่น SIGINT หรือ SIGTERM

package main

import (
    "fmt"
    "os"
    "os/signal"
    "syscall"
)

func main() {
    sigs := make(chan os.Signal, 1)
    done := make(chan bool, 1)

    signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

    go func() {
        sig := <-sigs
        fmt.Println()
        fmt.Println("Received signal:", sig)
        fmt.Println("Cleaning up and exiting...")
        done <- true
    }()

    fmt.Println("Waiting for signal...")
    <-done
    fmt.Println("Exiting program")
}

 

สร้าง Child Process

package main

import (
    "fmt"
    "os/exec"
)

func main() {
    cmd := exec.Command("ls", "-lh", "/usr")
    output, err := cmd.CombinedOutput()
    if err != nil {
        fmt.Println("Error:", err)
    }
    fmt.Println(string(output))
}

 

ข้อดี Go

✔️ Type-safe และ error handling ชัดเจน
✔️ รองรับ signal และ process control สำหรับ backend server
✔️ สามารถจัดการ lifecycle ของ process ได้ปลอดภัย

 

ข้อจำกัด

⚠️ Syntax verbose กว่า Node.js
⚠️ ต้องสร้าง channel และ goroutine สำหรับ signal

 

3. แนวทางปฏิบัติที่เหมาะสม

 

✔️ จับ Signal อย่างถูกต้อง เพื่อ shutdown gracefully

  • Node.js: process.on('SIGTERM')
  • Go: signal.Notify + channel + goroutine

 

✔️ จัดการ Child Process อย่างระมัดระวัง

  • ใช้ stdout/stderr เพื่อตรวจสอบ output
  • รอ process เสร็จ (wait / on('close'))

 

✔️ Logging และ Cleanup

  • บันทึก event และ clean resources เช่น close DB, stop server
  • ป้องกัน zombie process หรือ memory leak

 

4. สรุปเปรียบเทียบ Signal & Process JavaScript vs Go

 

FeatureJavaScript (Node.js)Go
Capture Signalsprocess.on('SIGINT')signal.Notify + channel
Child Processchild_process.spawn / execos/exec.Command
Async HandlingEvent-driven / callbackGoroutine + channel
Loggingconsole / winstonfmt / logrus / zap
Error HandlingCallback / try/catchReturn error + type-safe
Graceful ShutdownSupportedSupported

 

คำแนะนำ

✔️ Web server / event-driven apps → Node.js เหมาะสำหรับ rapid development
✔️ Backend service / concurrent / type-safe → Go เหมาะสำหรับ production-critical system

 


 

ตอนต่อไป

 

ใน EP.30 ของซีรีส์ JS2GO เราจะพาคุณไปเรียนรู้ การทำงานกับ HTTP Requests และ Responses: JavaScript (Fetch/Express) vs Go (net/http) เพื่อเปรียบเทียบการสร้าง API และการจัดการ HTTP อย่างมืออาชีพ

 

อ่านบทความ Series อื่นๆ

🔵 Facebook: https://www.facebook.com/superdev.academy.th

🔴 YouTube : Superdev Academy

📸 Instagram: Superdev Academy

🎬 TikTok: https://www.tiktok.com/@superdevacademy?lang=th-TH

🌐 Website: https://www.superdevacademy.com/