36
Cơ bản về quản trị Linux
3.3.6
Giới thiệu tín hiệu
Để diệt, dừng hay tiếp tục tiến trình, Linux sử dụng một hình thức thông tin đặc biệt, gọi
là "tín hiệu" ("signal"). Bằng việc gửi tín hiệu tới một tiến trình, gạn có thể kết thúc, dừng,
hay làm những thứ khác. Đây là những gì xảy ra khi gõ Control-C, Control-Z, hay sử dụng
bg, fg
– sử dụng bash để gửi tín hiệu riêng tới tiến trình. Những tín hiệu này có thể gửi
qua câu lệnh kill, chỉ rõ pid (id tiến trình) trên dòng lệnh:
$ kill -s SIGSTOP 16224
$ jobs -l
[1]- 16217 Running
xeyes -center red &
[2]+ 16224 Stopped (signal) xeyes -center blue
Như bạn đã thấy, kill không nhất định "giết" một tiến trình, mặc dù có thể. Sử dụng
tùy chọn "-s", kill có thể gửi bất kỳ tín hiệu nào tới một tiến trình. Linux diệt, dừng, hay
tiếp tục tiến trình khi gửi các tín hiệu SIGINT, SIGSTOP, hay SIGCONT tương ứng. Có thể
gửi các tín hiệu khác nữa; một vài trong số chúng biên dịch phụ thuộc vào ứng dụng. Có thể
biết một tiến trình chấp nhận tín hiệu gì tại phần SIGNALS trang man của nó.
3.3.7
SIGTERM và SIGINT
Nếu muốn diệt một tiến trình, có thể có vài tùy chọn. Theo mặc định, kill gửi tín hiệu
SIGTERM, mà không đồng nhất với SIGINT hay Control-C, nhưng thường có cùng kết
quả:
$ kill 16217
$ jobs -l
[1]- 16217 Terminated
xeyes -center red
[2]+ 16224 Stopped (signal)
xeyes -center blue
3.3.8
"Diệt tận gốc"
Tiến trình có thể lờ đi cả SIGTERM và SIGINT, hoặc một trong chúng hoặc chúng đã dừng,
hoặc ở vào "thế bí". Trong những trường hợp này cần giải pháp mạnh, tín hiệu SIGKILL.
Một tiến trình không thể lờ đi SIGKILL:
$ kill 16224
$ jobs -l
[2]+ 16224 Stopped (signal)
xeyes -center blue
$ kill -s SIGKILL
\$ jobs -l
[2]+ 16224 Interrupt
xeyes -center blue