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

2 comments:

  1. Tìm MEM (RSS) tất cả các process tên salt-master dùng:

    # ps -C salt-master -o pid,ppid,cmd,rss
    PID PPID CMD RSS
    742 1 /usr/bin/python /usr/bin/sa 19032
    1020 742 /usr/bin/python /usr/bin/sa 28044
    1027 742 /usr/bin/python /usr/bin/sa 17096
    1028 742 /usr/bin/python /usr/bin/sa 20052
    1033 742 /usr/bin/python /usr/bin/sa 40196
    1034 742 /usr/bin/python /usr/bin/sa 42256
    1039 742 /usr/bin/python /usr/bin/sa 41844
    1040 742 /usr/bin/python /usr/bin/sa 42112
    1043 742 /usr/bin/python /usr/bin/sa 42016

    ReplyDelete
  2. dùng ``args`` ở cuối cùng khi format (-o) sẽ in ra đầy đủ câu lệnh.
    $ ps -C salt-master -o pid,ppid,rss,args
    PID PPID RSS COMMAND
    26025 1 344 /usr/bin/python /usr/bin/salt-master
    26050 26025 25456 /usr/bin/python /usr/bin/salt-master
    26057 26025 440 /usr/bin/python /usr/bin/salt-master
    26058 26025 11384 /usr/bin/python /usr/bin/salt-master
    26063 26025 85116 /usr/bin/python /usr/bin/salt-master
    26064 26025 88716 /usr/bin/python /usr/bin/salt-master
    26065 26025 0 [salt-master]
    26077 26025 91196 /usr/bin/python /usr/bin/salt-master
    26078 26025 87692 /usr/bin/python /usr/bin/salt-master

    ReplyDelete