Signal là cơ chế thông báo bất đồng bộ mà OS hoặc process khác gửi tới một process: SIGTERM (15, yêu cầu kết thúc — mặc định của kill PID), SIGKILL (9, giết cưỡng bức — không thể catch hay ignore), SIGINT (2, Ctrl+C), SIGHUP (1, đóng terminal / reload config), SIGUSR1 và SIGUSR2 (do người dùng định nghĩa; Node.js dùng SIGUSR1 để bật debugger), SIGCHLD (process con kết thúc), SIGPIPE (ghi vào pipe mà đầu đọc đã đóng, tức broken pipe).
Graceful shutdown là phần sống còn ở production: nhận SIGTERM thì server ngừng nhận kết nối mới, xử nốt request đang chạy, đóng kết nối DB, flush log rồi mới thoát.
process.on('SIGTERM', async () => {
await server.close()
await db.disconnect()
process.exit(0)
})Kubernetes gửi SIGTERM trước, chờ hết terminationGracePeriodSeconds (mặc định 30s) rồi mới SIGKILL — muốn deploy zero-downtime thì bắt buộc phải xử lý SIGTERM.
Bên Go dùng signal.NotifyContext(ctx, syscall.SIGTERM) để lan cancellation xuống mọi goroutine khi có signal.