Wednesday, 20 November 2013

ps và những option ít được biết tới

Ai dùng UNIX-like OS hẳn cũng phải biết tới lệnh `ps`, nếu không, có lẽ là họ vẫn chưa biết gì !?!

Câu lệnh (chương trình) `ps` trên Linux Ubuntu 12.04 nằm trong package procps. Với nhu cầu sử dụng bình thường, người dùng chỉ cần biết một vài tổ hợp sau đây là đủ:
ps -eFH
ps awwxf

rồi `grep` ra từ khóa mình cần tìm.
Ví dụ:

$ ps -eFH | grep firefox
hvn        930     1 17 341885 728808 2 06:52 ?        00:03:27   firefox
hvn       1055   930  4 106318 63936  2 06:53 ?        00:00:48     /usr/lib/firefox/plugin-container /usr/lib/mozilla/plugins/libflashplayer.so -greomni /usr/lib/firefox/omni.ja -appomni /usr/lib/firefox/browser/omni.ja -appdir /usr/lib/firefox/browser 930 plugin
hvn       1093   930  0 68027 20356   0 06:53 ?        00:00:00     /usr/lib/firefox/plugin-container /opt/google/talkplugin/libnpgoogletalk.so -greomni /usr/lib/firefox/omni.ja -appomni /usr/lib/firefox/browser/omni.ja -appdir /usr/lib/firefox/browser 930 plugin
hvn       1562  1481  0  2670  1104   1 07:12 pts/6    00:00:00       grep --color=auto firefox

Biết thế coi như là đủ nếu bạn không cần gì đặc biệt hơn.

Sau đây là một vài option đặc biệt.
Trước tiên, một điều cần biết là lệnh `ps` hỗ trợ 3 style để pass option.
Kiểu -e -F (hay -eF) của UNIX, kiểu `ps awwx` (không có dấu - ở đầu) của BSD và kiểu --dài_dòng của GNU. 3 style này không nên dùng lẫn lộn nhau.

Các option sau đây thuộc style UNIX:
1.  -C #Chọn process bằng tên câu lệnh.
Ví dụ:
$ ps -C firefox
  PID TTY          TIME CMD
  930 ?        00:04:13 firefox

Có thể thấy số kết quả câu lệnh này khác với `ps | grep [f]irefox` bởi câu lệnh trên chỉ tìm theo tên câu lệnh, trong khi câu lệnh sử dụng `grep` là để tìm từ khóa. (tức từ khóa có thể không phải câu lệnh, có thể là tên user, số pid, args của câu lệnh)



2. -o format #chọn những gì output sẽ hiển thị
hvn@archhvn: ~ () $ ps -C firefox -o pid=
  930
hvn@archhvn: ~ () $ ps -C firefox -o pid
  PID
  930
Dấu = ở đuôi mỗi "format specifier" làm mất đi tên của cột hiển thị.
 $ ps -C firefox -opid,user,cmd,pcpu,pmem
  PID USER     CMD                         %CPU %MEM
  930 hvn      firefox                     16.2 18.8

$ ps -C firefox -opid=,user=,cmd=,pcpu=,pmem=
  930 hvn      firefox                     16.2 19.0

Các format specifier có trong mục STANDARD FORMAT SPECIFIERS của `man ps`

3.  --sort # sắp xếp output theo một cột nào đó - kếp hợp với -o
Ví dụ list ra 10 process dùng nhiều cpu nhất.
$ ps -eo cmd,pcpu --sort +pcpu | tail
urxvt                        0.1
tmux new -d -s main.tmux     0.1
urxvt                        0.1
parcellite                   0.2
/usr/lib/ibus/ibus-engine-m  0.2
top                          0.3
ibus-daemon                  0.8
X :0                         1.4
/usr/lib/firefox/plugin-con  4.3
firefox                     15.9