คำสั่ง Linux ที่ใช้ในการแสดงสถานะของเครื่อง Server - mrolarik/simple-iot GitHub Wiki

คำสั่ง Linux (Linux Command) ที่ใช้ในการแสดงสถานะของเครื่อง Server แสดงดังต่อไปนี้

การตรวจสอบสถานะของหน่วยความจำ (Memory)

การตรวจสอบหน่วยความจำบนระบบ Linux สามารถใช้คำสั่ง free ตัวอย่างเช่น

$ free
              total        used        free      shared  buff/cache   available
Mem:       16402800     4070440     8427736      236216     3904624    11674080
Swap:       6266876           0     6266876

ดังนั้น หากต้องการที่จะดูตัวเลือก (option) ของคำสั่ง free สามารถทำได้โดยพิมพ์คำสั่ง free --help เช่น

$ free --help

Usage:
 free [options]

Options:
 -b, --bytes         show output in bytes
 -k, --kilo          show output in kilobytes
 -m, --mega          show output in megabytes
 -g, --giga          show output in gigabytes
     --tera          show output in terabytes
 -h, --human         show human-readable output
     --si            use powers of 1000 not 1024
 -l, --lohi          show detailed low and high memory statistics
 -t, --total         show total for RAM + swap
 -s N, --seconds N   repeat printing every N seconds
 -c N, --count N     repeat printing N times, then exit
 -w, --wide          wide output

     --help     display this help and exit
 -V, --version  output version information and exit

For more details see free(1).

เมื่อเปิดดู option ของคำสั่ง free จะเห็นว่ามี option ให้เลือกใช้มากมาย แต่ที่น่าสนใจคือ -h หรือ --human ซึ่งหมายถึงให้แสดงข้อมูลในรูปแบบที่สามารถเข้าใจได้ (human-readable output) สามารถใช้คำสั่งดังต่อไปนี้ free -h ผลลัพธ์ที่ได้แสดงดังต่อไปนี้

$ free -h
              total        used        free      shared  buff/cache   available
Mem:            15G        3.9G        8.0G        237M        3.7G         11G
Swap:          6.0G          0B        6.0G

หากนำผลลัพธ์ที่ได้จากคำสั่งทั้งสองมาเปรียบเทียบ จะเห็นได้ชัดเจนว่า free -h แสดงข้อมูลที่เราสามารถเข้าใจได้ง่ายกว่า

$ free
              total        used        free      shared  buff/cache   available
Mem:       16402800     4070440     8427736      236216     3904624    11674080

$ free -h
              total        used        free      shared  buff/cache   available
Mem:            15G        3.9G        8.0G        237M        3.7G         11G

จากตัวอย่าง จะเห็นว่ามีหน่วยความจำทั้งหมด (total) 15G และหน่วยความจำที่ถูกใช้งาน (used) 3.9G ดังนั้นหากต้องการที่จะใช้คำสั่งเพื่อดึงข้อมูลบางตัวออกมาใช้งาน เช่น ข้อมูลหน่วยความจำทั้งหมด 15G สามารถทำได้โดย ใช้คำสั่งดังนี้

$ free -h | grep 'Mem' | awk '{print $2}'

ผลลัพธ์ที่ได้คือ

15G

แต่หากต้องการแสดงเฉพาะตัวเลข 15 โดยไม่สนใจตัวอักษร (string) G ใช้คำสั่งดังต่อไปนี้

$ free -h | grep Mem | awk '{print substr($2,1,length($2)-1)}'

ผลลัพธ์ที่ได้คือ

15

อธิบายคำสั่งที่ใช้งาน

จากตัวอย่างของคำสั่งข้างต้น เห็นได้ว่าคำสั่ง Linux (Linux command line) สามารถที่จะส่งผลลัพธ์ไปคำนวณต่อโดยใช้เครื่องหมาย | หรือเรียกว่า pipe ดังนั้น เราจึงนำผลลัพธ์ที่ได้จากคำสั่งแรก ส่งไปยังคำสั่งที่สอง และคำสั่งต่อไปเรื่อย ๆ จนได้ผลลัพธ์ที่ต้องการ เช่น

  • ผลลัพธ์ที่ได้จากคำสั่งแรก free -h
$ free -h
              total        used        free      shared  buff/cache   available
Mem:            15G        4.1G        7.8G        233M        3.7G         10G
Swap:          6.0G          0B        6.0G
  • จากนั้นนำผลลัพธ์ที่ได้ไปทำงานต่อโดยใช้คำสั่ง grep ซึ่งคำสั่ง grep ใช้สำหรับค้นหา (search) ข้อความ ดังนั้น เมื่อใช้คำสั่ง grep 'Mem' จึงหมายถึงค้นหาคำว่า Mem จากผลลัพธ์ที่ส่งมาจากคำสั่งแรก ผลลัพธ์ที่ได้ แสดงดังต่อไปนี้
$ free -h | grep 'Mem'
Mem:            15G        4.3G        7.7G        233M        3.7G         10G
  • ขั้นตอนถัดไป หากต้องการแสดงจำนวนของหน่วยความจำ (Memory) ทั้งหมดที่มีอยู่ สามารถส่งผลลัพธ์ที่ได้จากคำสั่ง grep ไปประมวลผล โดยใช้คำสั่ง awk เข้ามาช่วย ซึ่งคำสั่ง awk มาจาก Aho, Weinberger, Kernighan ซึ่งเป็นผู้ที่คิดค้นฟังก์ชันการทำงานในการจับคู่ (match) ข้อมูลที่มีรูปแบบ (pattern) ที่ต้องการ
  • ตัวอย่างคำสั่ง awk ที่นำมาใช้ในกรณีนี้ แสดงดังต่อไปนี้
$ free -h | grep 'Mem' | awk '{print $2}'
15G
  • จากตัวอย่างคำสั่ง awk ข้างต้น คือการสั่งให้แสดง (print) ข้อมูลของคอลัมน์ที่สอง $2 ผลลัพธ์ที่ได้จึงเป็น 15G
  • คำสั่ง awk ยังสามารถใช้คำสั่งย่อยได้อีก เช่น คำสั่ง length, split
  • ดังนั้น หากต้องการแสดงเฉพาะตัวเลข 15 จึงสามารถทำได้โดย
$ free -h | grep Mem | awk '{print substr($2,1,length($2)-1)}'
15
  • โดยคำสั่ง length($2)-1 หมายถึง นับจำนวนของตัวอักษรในคำที่ 2 ($2) ในกรณีนี้นับได้ทั้งสิ้น 3 ตัวอักษร และลบออกไป 1 ตัวอักษร นั่นหมายถึงลบตัวอักษร G ดังนั้น ผลลัพธ์ที่ได้คือ 2
  • คำสั่ง substr($2,1,length($2)-1) จึงหมายถึงให้เลือกข้อมูลที่จะนำมาแสดง โดยเลือกแสดงตั้งแต่ตัวที่ 1 ถึงตัวที่ 2
  • จากตัวอย่างข้างต้น จึงทำให้ทราบว่าเครื่องคอมพิวเตอร์ที่ใช้งานอยู่มีหน่วยความจำทั้งหมด 15G ดังนั้น เราสามารถนำตัวเลข 15 ไปใช้ประโยชน์ เช่นส่งข้อมูลไปยัง NETPIE เพื่อแสดงผลบน Freeboard

คำสั่งที่ใช้เพื่อตรวจสอบสถานะของหน่วยความจำ แสดงดังต่อไปนี้

คำสั่งตรวจสอบหน่วยความจำทั้งหมด

$ free -h | grep Mem | awk '{print substr($2,1,length($2)-1)}'

คำสั่งตรวจสอบหน่วยความจำที่ใช้งาน

$ free -h | grep Mem | awk '{print substr($3,1,length($3)-1)}'

การตรวจสอบจำนวนโพรเซส (Running Process)

  • การตรวจสอบจำนวนของโพรเซสที่กำลังทำงานอยู่ใช้คำสั่ง ps ดังนั้นสามารถเรียกดูการใช้งานคำสั่ง ps โดยพิมพ์คำสั่งดังนี้
$ ps --help

Usage:
 ps [options]

 Try 'ps --help <simple|list|output|threads|misc|all>'
  or 'ps --help <s|l|o|t|m|a>'
 for additional help text.

For more details see ps(1).
  • จากนั้นสามารถเลือกดูตัวเลือก (option) ต่าง ๆ ได้เช่น simple, list, output, threads, misc และ all โดยพิมพ์คำสั่งดังนี้
$ ps --help simple

Usage:
 ps [options]

Basic options:
 -A, -e               all processes
 -a                   all with tty, except session leaders
  a                   all with tty, including other users
 -d                   all except session leaders
 -N, --deselect       negate selection
  r                   only running processes
  T                   all processes on this terminal
  x                   processes without controlling ttys

For more details see ps(1).

หรือ

$ ps --help list

Usage:
 ps [options]

Selection by list:
 -C <command>         command name
 -G, --Group <GID>    real group id or name
 -g, --group <group>  session or effective group name
 -p, p, --pid <PID>   process id
        --ppid <PID>  parent process id
 -q, q, --quick-pid <PID>
                      process id (quick mode)
 -s, --sid <session>  session id
 -t, t, --tty <tty>   terminal
 -u, U, --user <UID>  effective user id or name
 -U, --User <UID>     real user id or name

  The selection options take as their argument either:
    a comma-separated list e.g. '-u root,nobody' or
    a blank-separated list e.g. '-p 123 4567'

For more details see ps(1).
  • ดังนั้น หากต้องการดูสถานะของโพรเซสที่กำลังทำงานอยู่สามารถใช้คำสั่งดังต่อไปนี้
$ ps aux

ตัวอย่างบางส่วนของผลลัพธ์ที่ได้

root      6426  0.0  0.0  12472  2492 ?        Ss   Aug20   0:00 /sbin/mount.ntfs /dev/sda1 /media/mrolarik/Data_P1 -o rw,nodev,nosuid,uid=1000,gid=1000,uhelper=udisks2
mrolarik  6447  3.8  4.0 3140588 656252 ?      Sl   Aug20 108:50 /usr/lib/firefox/firefox
mrolarik  7473  0.0  0.0 426732  6712 ?        Sl   Aug20   0:00 /usr/lib/gvfs/gvfsd-network --spawner :1.4 /org/gtk/gvfs/exec_spaw/1
mrolarik  7493  0.0  0.0 361764  6912 ?        Sl   Aug20   0:00 /usr/lib/gvfs/gvfsd-dnssd --spawner :1.4 /org/gtk/gvfs/exec_spaw/3
mrolarik  8468  0.0  0.3 598352 59184 ?        Sl   Aug20   0:00 /usr/bin/python3 /usr/share/system-config-printer/scp-dbus-service.py
mrolarik  8871 28.0  4.2 2642916 703616 ?      Sl   Aug20 746:08 /usr/lib/firefox/firefox -contentproc -childID 20 -isForBrowser -prefsLen 17389 -schedulerPrefs 0001,2 -greomni /usr/
mrolarik  9087  0.0  0.0 327372  8796 ?        Sl   Aug20   0:11 /usr/lib/speech-dispatcher-modules/sd_espeak /etc/speech-dispatcher/modules/espeak.conf
mrolarik  9092  0.0  0.0 289100  5216 ?        Sl   Aug20   0:11 /usr/lib/speech-dispatcher-modules/sd_cicero /etc/speech-dispatcher/modules/cicero.conf
mrolarik  9093  0.0  0.0      0     0 ?        Z    Aug20   0:00 [sd_cicero] <defunct>
mrolarik  9096  0.0  0.0 289100  5004 ?        Sl   Aug20   0:11 /usr/lib/speech-dispatcher-modules/sd_dummy /etc/speech-dispatcher/modules/dummy.conf
mrolarik  9099  0.0  0.0 289116  5256 ?        Sl   Aug20   0:11 /usr/lib/speech-dispatcher-modules/sd_generic /etc/speech-dispatcher/modules/generic.conf
mrolarik  9102  0.0  0.0  97264  2472 ?        Ssl  Aug20   0:00 /usr/bin/speech-dispatcher --spawn --communication-method unix_socket --socket-path /run/user/1000/speech-dispatcher/
mrolarik 11035 15.7  6.7 3392584 1102856 ?     Sl   Aug20 407:10 /usr/lib/firefox/firefox -contentproc -childID 24 -isForBrowser -prefsLen 17389 -schedulerPrefs 0001,2 -greomni /usr/
mrolarik 12571  1.3  4.3 2615212 706640 ?      Sl   Aug20  33:42 /usr/lib/firefox/firefox -contentproc -childID 25 -isForBrowser -prefsLen 17389 -schedulerPrefs 0001,2 -greomni /usr/
mrolarik 13304  4.4  4.1 3506688 686988 ?      Sl   Aug20 106:06 /usr/lib/firefox/firefox -contentproc -childID 26 -isForBrowser -prefsLen 17389 -schedulerPrefs 0001,2 -greomni /usr/
mrolarik 21270  0.0  0.2 617664 46880 ?        Sl   Aug21   0:18 mousepad /home/mrolarik/Desktop/ws_python/cpu-usage/netpie_cpu_usage.py
mrolarik 23133  0.0  0.2 570288 33060 ?        Sl   Aug21   0:30 /usr/bin/xfce4-terminal
mrolarik 23140  0.0  0.0  14872  1768 ?        S    Aug21   0:00 gnome-pty-helper
mrolarik 23141  0.0  0.0  23512  6080 pts/1    Ss   Aug21   0:00 bash
mrolarik 23174  0.0  0.0  44924  5208 pts/1    S+   Aug21   0:01 ssh [email protected]
mrolarik 24553  0.1  1.7 3135876 292256 ?      SLl  Aug21   1:34 /usr/lib/chromium-browser/chromium-browser --enable-pinch
mrolarik 24561  0.0  0.2 421072 44784 ?        S    Aug21   0:00 /usr/lib/chromium-browser/chromium-browser --type=zygote
mrolarik 24563  0.0  0.1 421072 31272 ?        S    Aug21   0:00 /usr/lib/chromium-browser/chromium-browser --type=zygote
mrolarik 24588  0.0  0.5 1516904 97832 ?       Sl   Aug21   0:52 /usr/lib/chromium-browser/chromium-browser --type=gpu-process --field-trial-handle=15914299173715458049,2869653679187
mrolarik 24641  0.0  0.5 1234232 95840 ?       Sl   Aug21   0:02 /usr/lib/chromium-browser/chromium-browser --type=renderer --field-trial-handle=15914299173715458049,2869653679187268
mrolarik 24655  0.1  1.8 2095112 304180 ?      Sl   Aug21   1:13 /usr/lib/chromium-browser/chromium-browser --type=renderer --field-trial-handle=15914299173715458049,2869653679187268
root     27131  0.0  0.0      0     0 ?        I    02:52   0:14 [kworker/3:1]
root     28449  0.0  0.0      0     0 ?        I    06:59   0:11 [kworker/1:2]
root     28764  0.0  0.0  96164 10452 ?        Ss   07:35   0:00 /usr/sbin/cupsd -l
  • หากต้องการที่จะนับจำนวนโพรเซส สามารถใช้คำสั่ง wc เข้ามาช่วย โดยคำสั่ง wc มีตัวเลือกให้ใช้งานดังนี้
$ wc --help
Usage: wc [OPTION]... [FILE]...
  or:  wc [OPTION]... --files0-from=F
Print newline, word, and byte counts for each FILE, and a total line if
more than one FILE is specified.  A word is a non-zero-length sequence of
characters delimited by white space.

With no FILE, or when FILE is -, read standard input.

The options below may be used to select which counts are printed, always in
the following order: newline, word, character, byte, maximum line length.
  -c, --bytes            print the byte counts
  -m, --chars            print the character counts
  -l, --lines            print the newline counts
      --files0-from=F    read input from the files specified by
                           NUL-terminated names in file F;
                           If F is - then read names from standard input
  -L, --max-line-length  print the maximum display width
  -w, --words            print the word counts
      --help     display this help and exit
      --version  output version information and exit

GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
Full documentation at: <http://www.gnu.org/software/coreutils/wc>
or available locally via: info '(coreutils) wc invocation'
  • ในกรณีนี้จะใช้คำสั่ง wc -l เพื่อนับจำนวนบรรทัด (line) ที่ได้มาจากคำสั่ง ps aux คำสั่งที่ใช้งาน แสดงดังต่อไปนี้
$ ps aux | wc -l

ตัวอย่างผลลัพธ์ที่ได้ ได้แก่

241

จากตัวอย่าง แสดงว่าขณะนี้เครื่องคอมพิวเตอร์มีจำนวนโพรเซสที่ทำงานอยู่ 241 process

คำสั่งตรวจสอบจำนวนโพรเซสที่กำลังทำงาน

$ ps aux | wc -l

การตรวจสอบจำนวนวันที่เปิดเครื่อง (uptime)

คำสั่ง uptime เป็นการแสดงเวลาทั้งหมดในการเปิดเครื่องคอมพิวเตอร์ สามารถดูตัวเลือกของคำสั่ง uptime โดยพิมพ์คำสั่งดังต่อไปนี้

$ uptime --help

Usage:
 uptime [options]

Options:
 -p, --pretty   show uptime in pretty format
 -h, --help     display this help and exit
 -s, --since    system up since
 -V, --version  output version information and exit

For more details see uptime(1).
  • สามารถพิมพ์คำสั่ง uptime เพื่อดูรายละเอียดทั้งหมด แสดงดังต่อไปนี้
$ uptime
 11:21:23 up 3 days, 15:07,  4 users,  load average: 0.33, 0.50, 0.46
  • หากใช้ตัวเลือก -p หรือ --pretty จะทำให้ระบบแสดงรูปแบบที่สวยงามและเข้าใจง่ายขึ้น เช่น
$ uptime -p
up 3 days, 15 hours, 8 minutes

หรือ

$ uptime --pretty
up 3 days, 15 hours, 8 minutes

ผลลัพธ์ที่ได้แสดงให้เห็นว่าเครื่องคอมพิวเตอร์ที่ทดสอบได้เปิดทำงาน 3 วัน 15 ชั่วโมง 8 นาที

การตรวจสอบสถานะของ CPU

  • การตรวจสอบสถานะของ CPU อ้างอิงจากบทความ (How Linux CPU Usage Time and Percentage is calculated)[https://github.com/Leo-G/DevopsWiki/wiki/How-Linux-CPU-Usage-Time-and-Percentage-is-calculated]
  • เนื่องจากชุดคำสั่งที่ใช้ในการแสดงสถานะของ CPU ค่อนข้างที่จะยาวจึงมีความจำเป็นต้องเขียน script ซึ่งเป็นภาษา shell script เพื่อสั่งให้เครื่องคอมพิวเตอร์คำนวณและแสดงผลลัพธ์ ตัวอย่าง script แสดงดังต่อไปนี้
#-----------cpu_usage.sh------------------
#!/bin/bash
    # by Paul Colby (http://colby.id.au), no rights reserved ;)

    PREV_TOTAL=0
    PREV_IDLE=0

    while true; do
      # Get the total CPU statistics, discarding the 'cpu ' prefix.
      CPU=(`sed -n 's/^cpu\s//p' /proc/stat`)
      IDLE=${CPU[3]} # Just the idle CPU time.

      # Calculate the total CPU time.
      TOTAL=0
      for VALUE in "${CPU[@]}"; do
        let "TOTAL=$TOTAL+$VALUE"
      done

      # Calculate the CPU usage since we last checked.
      let "DIFF_IDLE=$IDLE-$PREV_IDLE"
      let "DIFF_TOTAL=$TOTAL-$PREV_TOTAL"
      let "DIFF_USAGE=(1000*($DIFF_TOTAL-$DIFF_IDLE)/$DIFF_TOTAL+5)/10"
      echo -en "\rCPU: $DIFF_USAGE%  \b\b"

      # Remember the total and idle CPU times for the next check.
      PREV_TOTAL="$TOTAL"
      PREV_IDLE="$IDLE"

      # Wait before checking again.
      sleep 1
    done
  • ขั้นตอนถัดไปให้กำหนดสิทธิ์การทำงานของไฟล์ cpu_usage.sh เพื่อให้สามารถทำการ execute ได้ โดยพิมพ์คำสั่งดังต่อไปนี้
$ chmod +x cpu_usage.sh
  • จากนั้นจึงจะสามารถสั่งให้โปรแกรมทำงานได้ โดยพิมพ์คำสั่งดังนี้
$ ./cpu_usage.sh

ผลลัพธ์ที่ได้จากการคำนวณ ระบบจะแสดงผลการทำงานของ CPU โดยแสดงออกมาเป็น % และแสดงทุก ๆ 1 วินาที เนื่องจากในตัวโปรแกรมใช้คำสั่ง while true; do ทำให้โปรแกรมทำงานตลอดเวลา และการแสดงผลทุก ๆ 1 วินาทีนั้น มาจากคำสั่ง sleep 1 นั่นหมายความว่าเมื่อทำงานมาถึงคำสั่ง sleep 1 ระบบจะหยุดการทำงาน 1 วินาที และจะทำงานใหม่อีกครั้ง ผลลัพธ์ของโปรแกรมแสดงดังต่อไปนี้

52%

แสดงว่า ขณะนี้เครื่องคอมพิวเตอร์ที่ทดสอบใช้ทรัพยากร CPU จำนวน 52%

การตรวจสอบ package ที่ไม่ update

การตรวจสอบ package ที่ไม่ update สามารถทำได้หลากหลายวิธี เช่น

$ apt-get -s upgrade | grep upgraded

ผลลัพธ์ที่ได้

0 upgraded, 0 newly installed, 0 to remove and 2 not upgraded.

จากตัวอย่าง แสดงให้เห็นว่ามี package ที่ไม่ได้ update อยู่จำนวน 2 package (2 not upgraded)

  • หรือใช้คำสั่งดังต่อไปนี้
$ apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }'

ผลลัพธ์ที่ได้

google-chrome-stable
pigz
docker-ce

โดยวิธีนี้จะแสดงรายชื่อของ package ที่ไม่ update หากต้องการที่จะนับจำนวนของ package ให้ใช้คำสั่ง wc -l เข้ามาช่วย เช่น

$ apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }' | wc -l

ผลลัพธ์ที่ได้คือ

3
  • หรืออาจใช้คำสั่งดังต่อไปนี้
$ apt list --upgradable

ผลลัพธ์ที่ได้คือ

Listing... Done
docker-ce/artful 18.06.1~ce~3-0~ubuntu amd64 [upgradable from: 17.12.1~ce-0~ubuntu]
google-chrome-stable/stable 68.0.3440.106-1 amd64 [upgradable from: 65.0.3325.162-1]

แต่หากต้องการที่จะนับจำนวนสามารถใช้คำสั่งดังต่อไปนี้

$ apt list --upgradable | wc -l

ผลลัพธ์คือ

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

3

รายละเอียดเพิ่มเติม

⚠️ **GitHub.com Fallback** ⚠️