Wednesday, 4 November 2015

Ghi nháy về lọc process theo state bằng check_procs

check_procs là tên của chương trình dùng để check process trên 1 máy theo tiêu chí nào nó.

Bài viết nhắm tới độc giả đã sử dụng check_procs / nagios / shinken. 

Trên Ubuntu 14.04 nó nằm trong package:
$ dpkg -S '/usr/lib/nagios/plugins/check_procs'
nagios-plugins-basic: /usr/lib/nagios/plugins/check_procs
Được dùng trong monitoring, thường dùng kèm với NRPE, NSCA, nagios, shinken ...

check_procs có chức năng lọc process theo state, nó lấy output của lênh:
/bin/ps axwwo 'stat uid pid ppid vsz rss pcpu etime comm args'
rồi xử lý. State của 1 process là ký hiệu xuất hiện ở cột đầu tiên trong output của lệnh trên.

Ta có thể liệt kê / đếm các process có state là S bằng lệnh sau:
$ /usr/lib/nagios/plugins/check_procs -s S -vv | head -n4
CMD: /bin/ps axwwo 'stat uid pid ppid vsz rss pcpu etime comm args'
Matched: uid=0 vsz=0 rss=0 pid=2 ppid=0 pcpu=0.00 stat=S etime=70-01:46:40 prog=kthreadd args=[kthreadd]
Matched: uid=0 vsz=0 rss=0 pid=3 ppid=2 pcpu=0.00 stat=S etime=70-01:46:40 prog=0 args=[ksoftirqd/0]
Matched: uid=0 vsz=0 rss=0 pid=7 ppid=2 pcpu=0.00 stat=S etime=70-01:46:40 prog=rcu_sched args=[rcu_sched]
$ /usr/lib/nagios/plugins/check_procs -s S
PROCS OK: 45 processes with STATE = S | procs=45;;;0;

Để kiểm tra / so sánh state người dùng đưa vào qua option -s và state ở output của lện ps , check_procs sử dụng C function: strstr. Hàm này có signature:
 char *strstr(const char *s1, const char *s2); 
Function này sẽ tìm s2 có ở trong s1 không. Code:
   if ((options & STAT) && (strstr (statopts, procstat)))
    resultsum |= STAT;

cụ thể ở đây check_procs sẽ kiểm tra state của mỗi process có phải sub-string của giá trị mà người dùng đưa vào không.

Bởi vậy nếu bạn dùng ``check_procs -s Ss``, các process có state là ``S`` và ``Ss`` đều hiện ra.
Và không có cách nào để chỉ lọc ra các process có state là ``Ss``.

Tham khảo:
http://serverfault.com/questions/647807/nagios-check-procs-state-filter
http://manpages.ubuntu.com/manpages/trusty/en/man3/strstr.3posix.html

Hết.
HVN một ngày đầu đông.