Đã bao giờ bạn rơi vào tình cảnh rối như tơ vò mỗi khi một ứng dụng nào đó bị treo mà không thể nào tác động vào nó để restart hoặc chỉ đơn giản là cần tắt nó đi không. Nếu có thì bài viết này chắc hẳn sẽ rất hữu ích với bạn, ở đây chúng ta sẽ học về cách gửi các tín hiệu tới một tiến trình chạy trên hệ điều hành Unix/Linux sử dụng Signal và Trap. Chúng ta có thể thực hiện những công việc như tạm dừng, restart thậm chí là stop ngay lập tức tiến trình đang chạy đó.

1. Signal trong Unix/Linux

Signal là các tín hiệu ngắt phần mềm được gửi tới từ một chương trình hoặc admin để báo cho chúng biết rằng có một sự kiện nghiêm trọng đã xảy ra. Sự kiện này rất đa dạng và có thể là bất cứ hành động nào không an toàn. Một vài signal có thể kể đến như ngắt (9) cho biết rằng người dùng đang yêu cầu chương trình làm một công việc không trong sự kiểm soát.

Dưới đây là một số signal thông dụng được sử dụng:

Tên signal

Số hiệu signal

Miêu tả

SIGHUP1Trì hoãn việc kiểm tra trên quản lý terminal hoặc sự dừng của quản lý tiến trình.
SIGINT2Được thông báo nếu người sử dụng gửi một tín hiệu ngắt (Ctrl+C).
SIGQUIT3Được thông báo nếu người sử dụng gửi một tín hiệu bỏ (Ctrl+D).
SIGFPE8Được thông báo nếu một hoạt động thuộc về toán không hợp pháp được thử chạy.
SIGKILL9Nếu một tiến trình nhận signal này, nó phải thoát ra ngay lập tức và sẽ không thực hiện các hoạt động làm sạch.
SIGALRM14Tín hiệu báo số lần thực hiện (Alarm Clock).
SIGTERM15Tín hiệu kết thúc phần mềm (được gửi bởi sigkill theo mặc định).

Chúng ta cũng có thể yêu cầu Linux hiển thị ra list toàn bộ các signal bằng lệnh kill -l

~ kill -l                                                                                                                                                  
HUP INT QUIT ILL TRAP IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH POLL PWR SYS

Có một vài cách cho phép chúng ta có thể gửi signal tới tiến trình trong Linux. Một trong các phương thức phổ biến nhất mà user thường sử dụng đó là sử dụng tổ hợp phím “Ctrl + C” hoặc phím dừng trong khi một script đang chạy.

Khi chúng ta sử dụng tổ hợp phím này, một SIGINT sẽ được gửi tới script hoặc tiến trình đang được thực thi.

>>> Xem thêm bài viết:

Hướng dẫn cài đặt unix linux 

Hướng dẫn cài đặt k8s Kubenertes Cluster

Scheduling - Lập lịch trên K8s

Cú pháp để gửi đi một signal là :

kill -signal pid

Ví dụ, chúng ta muốn gửi signal dừng đến một tiến trình có pid là 500, chúng ta sẽ sử dụng lệnh dưới đây:

kill -9 500

Nó sẽ hủy tiến trình có pid là 500.

2. Trap signal trong Unix/Linux

Khi bạn nhấn phím Ctrl+C hoặc phím dừng tại terminal của bạn trong suốt quá trình chạy một chương trình shell, thông thường thì chương trình đó bị ngay lập tức kết thúc, và dòng nhắc lệnh xuất hiện trở lại. Việc này có thể sẽ không luôn luôn làm bạn thích thú. Ví dụ, bạn có thể sẽ để lại hàng loạt các tập tin tạm thời mà không được dọn sạch.

Trap signal là khá dễ dàng, và lệnh trap có cú pháp như sau:

trap commands signals

Ở đây, command có thể là bất cứ lệnh Unix có hiệu lực nào, hoặc ngay cả là một chức năng đã định nghĩa của người sử dụng, và signal có thể là danh sách các signal mà bạn muốn trap.

Chúng ta có thể sử dụng trap cho các mục đích sau đây:

  • Dọn sạch các file tạm thời
  • Bỏ qua các signal

Để dọn sạch các file tạm thời chúng ta có thể sử dụng một lệnh trap như sau:

trap "rm -f $WORKDIR/work1$$ $WORKDIR/dataout$$; exit" 2

Từ điểm trong chương trình shell mà trap này được thực thi, hai tệp work1$$ và dataout$$ sẽ tự động bị dỡ bỏ nếu signal số 2 được nhận bởi chương trình.

Vì thế nếu người sử dụng ngắt việc thi hành của chương trình thì sau đó trap này được chạy, bạn có thể được đảm bảo chắc chắn rằng hai file này sẽ được dọn sạch sẽ. Lệnh exit mà theo sau bởi rm là cần thiết bởi vì không có nó thì chương trình sẽ tiếp tục chạy tại điểm mà nó dừng lại khi signal được nhận.

Signal số 1 được tạo để trì hoãn: hoặc ai đó cố tình treo dòng hoặc dòng một cách ngẫu nhiên bị ngắt kết nối.

Bạn có thể chỉnh sửa trap trước để cũng gỡ bỏ hai file đã xác định trong trường hợp này bằng cách thêm signal số 1 tới danh sách các signal.

trap "rm $WORKDIR/work1$$ $WORKDIR/dataout$$; exit" 1 2

Bây giờ những file này sẽ bị gỡ bỏ nếu dòng bị treo hoặc nếu phím Ctrl+C được nhấn.

Lệnh được xác định để trap phải được bao quanh trong trích dẫn nếu chúng chứa nhiều hơn một lệnh. Bạn cũng lưu ý rằng shell quét dòng lệnh tại thời điểm mà lệnh trap được chạy và cũng thực hiện quét lần nữa khi một trong các signal được liệt kê được nhận.

Vì thế trong ví dụ trước, giá trị của WORKDIR và $$ sẽ được thay đổi tại thời gian mà lệnh trap được chạy. Nếu bạn muốn sự thay đổi này xảy ra tại thời điểm mà hoặc signal số 1 hoặc số 2 được nhận, bạn có thể đặt các lệnh bên trong trích dẫn đơn như sau:

trap 'rm $WORKDIR/work1$$ $WORKDIR/dataout$$; exit' 1 2

Ngoài ta, chúng ta có thể sử dụng trap để bỏ qua các signal trong Unix/Linux bằng cách điền lệnh null vào cho trap. Nếu giá trị này là null thì signal được xác định sẽ bị bỏ qua khi tiến trình nhận được signal này.

Ví dụ, chúng ta sẽ bỏ qua signal 2 sử dụng trap thì câu lệnh sẽ là:

trap '' 2

Để thiết lập lại trap chúng ta chỉ cần thực hiện việc bỏ câu lệnh ra khỏi input của trap, các đối số sẽ là các signal đã được thiết lập trước đó:

trap 2

Kết bài

Trap và signal trong Linux rất hữu dụng trong khi bạn cần điều khiển và quản lý các tiến trình đang được thực thi trên Linux. Nó cho phép chúng ta có thể quản lý và tùy chỉnh cách các tiến trình đang được thực thi tùy theo nghiệp vụ của mình.


Stringee Communication APIs là giải pháp cung cấp các tính năng giao tiếp như gọi thoại, gọi video, tin nhắn chat, SMS hay tổng đài CSKH cho phép tích hợp trực tiếp vào ứng dụng/website của doanh nghiệp nhanh chóng. Nhờ đó giúp tiết kiệm đến 80% thời gian và chi phí cho doanh nghiệp bởi thông thường nếu tự phát triển các tính năng này có thể mất từ 1 - 3 năm.

Bộ API giao tiếp của Stringee hiện đang được tin dùng bởi các doanh nghiệp ở mọi quy mô, lĩnh vực ngành nghề như TPBank, VOVBacsi24, VNDirect, Shinhan Finance, Ahamove, Logivan, Homedy,  Adavigo, bTaskee…

Quý bạn đọc quan tâm xin mời đăng ký NHẬN TƯ VẤN TẠI ĐÂY: