Hướng dẫn dùng signal handler trong PHP
Lệnh kill không lạ gì với người dùng Linux/MacOS. Ngay từ những ngày đầu học dùng dòng lệnh trên các hệ điều hành này, người dùng đã biết dùng kill để "giết" một chương trình đang chạy (một process). Show Câu lệnh này quá cơ bản, dẫn đến dễ bị bỏ qua việc tìm hiểu nó kỹ càng. Để kill 1 chương trình đang chay, người dùng sẽ tìm PID (process ID - một số nguyên dương được hệ điều hành cấp cho chương trình lúc bắt đầu chạy) bằng lệnh: ps xau | grep tên_chương_trình Ví dụ: $ ps xau | grep -i firefox 12537 chính là số PID. Sau đó gõ lệnh: kill 12537 và nếu chương trình vẫn chạy, thì dùng biện pháp mạnh: kill -9 12537 sẽ đảm bảo nhanh, gọn, sạch sẽ, xong. Nhưng bên dưới là cả một chủ đề không quá đơn giản đến vậy. $ whatis kill; dpkg -S `which kill` Vậy kill không phải là để "giết chết 1 process" mà thực ra nó gửi 1 signal (tín hiệu) tới một process. Trong Description của man 1 kill có ghi: The default signal for kill is TERM. Use -l or -L to list available signals. Particularly useful signals include HUP, INT, KILL, STOP, CONT, and 0. Alternate signals may be specified in three ways: -9, -SIGKILL or -KILL. Negative PID values may be used to choose whole process groups; see the PGID column in ps command output. A PID of -1 is special; it indicates all processes except the kill process itself and init. Thay vì kiểu gõ dùng số như kill -9, có thể gõ rõ tên signal ra, như kill -SIGKILL Các signal phổ biến TERM KILL HUP INT SIGTERM khác gì SIGKILL?> Unlike Process đang chạy khi nhận được SIGTERM sẽ hiểu là được yêu cầu kết thúc một cách lịch sự, chương trình thường sẽ dọn dẹp / đóng các tài nguyên đang sử dụng rồi thoát. Lập trình viên cũng có thể
làm gì tùy ý, hoặc không làm gì cả. Yêu cầu là việc của ông còn làm hay không thì không phải việc của ông. SIGKILL> The Người dùng gửi SIGKILL để kết thúc chương trình ngay lập tức, chữ KILL ở đây ám chỉ process sẽ không thể làm gì được, thậm chí là không biết. SIGKILL được hệ điều hành xử lý và nếu nó không kết thúc chương trình ngay, sẽ được xem như là một bug cần sửa của hệ điều hành. SIGINTKhi chạy chương trình bằng dòng lệnh, người dùng bấm Ctrl-C để gửi SIGINT tới chương trình, chương trình sẽ nhận được signal này và tùy ý xử lý, thường là sẽ dừng chương trình lại giống SIGTERM. Có thể dùng kill -2 hay kill -SIGINT để gửi signal này. Làm thế nào để tiếp tục chạy 1 chương trình mà có thể ngắt kết nối SSH? Vấn đề này thường được "vượt qua" bằng cách dùng chương trình tmux/screen sau khi SSH vào máy khác, dù mạng sau đó có đứt, thì chương trình vẫn chạy bình thường. Trích man 1 bash The shell exits by default upon receipt of a SIGHUP. Before exiting, an interactive shell resends the SIGHUP to all jobs, running or stopped. Stopped jobs are sent SIGCONT to ensure that they receive the SIGHUP. To prevent the shell from sending the signal to a particular job, it should be removed from the jobs table with the disown builtin (see SHELL BUILTIN COMMANDS below) or marked to not receive SIGHUP using disown -h. Các signal - không hề đơn giản, có tới 69-5 signal!!! $ kill -L 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP Thực hiện trên $ lsb_release -a; dpkg-query --show procps Tham khảo: Hết. |