คำสั่ง Linux ที่ใช้ในการแสดงสถานะของเครื่อง Server - mrolarik/simple-iot GitHub Wiki
คำสั่ง Linux (Linux Command) ที่ใช้ในการแสดงสถานะของเครื่อง Server แสดงดังต่อไปนี้
การตรวจสอบหน่วยความจำบนระบบ 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)}'
- การตรวจสอบจำนวนของโพรเซสที่กำลังทำงานอยู่ใช้คำสั่ง
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 --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 อ้างอิงจากบทความ (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 สามารถทำได้หลากหลายวิธี เช่น
$ 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
รายละเอียดเพิ่มเติม