Linux 基礎教程 37-進程命令

来源:https://www.cnblogs.com/surpassme/archive/2018/08/16/9484794.html
-Advertisement-
Play Games

pidof     我們知道每個小孩一齣生就會一個全國唯一的編號來對其進行標識,用於以後上學,辦社保等,就是我們的身份證號。那麼在Linux系統中,用來管理運行程式的標識叫做PID,就是大家熟知的進程ID。那麼如何來找到程式的PID了,那麼就需要用到命令 pidof ,其功能主要 ...


pidof

    我們知道每個小孩一齣生就會一個全國唯一的編號來對其進行標識,用於以後上學,辦社保等,就是我們的身份證號。那麼在Linux系統中,用來管理運行程式的標識叫做PID,就是大家熟知的進程ID。那麼如何來找到程式的PID了,那麼就需要用到命令pidof,其功能主要用來查看運行程式的PID。

基本用法

pidof [選項] [程式名]

其常用選項參數如下所示:

選項 說明
-s 僅返回一個PID
-c 僅返回具有相同root目錄的PID
-x 顯示由腳本開啟的進程
-o omitpid 忽略指定的PID
pidof命令的返回值通常只有兩個:
- 0:pidof命令至少找到一個對應的PID
- 1:pidof沒有找到任何匹配的PID

用法示例

1、顯示運行程式的PID

[root@localhost ~]# pidof sshd
34128 34059 28835 28820 24697 24627 23228 23215 1995

在顯示的結果可以看到共有9個PID,則說明伺服器上9個進程均是由sshd啟動的。

2、顯示Shell的進程

[root@localhost ~]# cat test.sh
#!/bin/bash
i=1;
while [ $i -le 10000 ]
do
 echo $i
 i=$((i+1))
 sleep 120s
done
[root@localhost ~]# ./test.sh &
[root@localhost ~]# pidof -x test.sh
36554

3、顯示指定程式的PID

[root@localhost ~]# pidof -s sshd
7524

4、忽略指定的PID

[root@localhost ~]# pidof sshd
9104 9103 7524 7434 4474 4462 1995
[root@localhost ~]# pidof sshd -o 1995
11979 11978 7524 7434 4474 4462

lsof

    在Windows中刪除文件時,會出現被占用而暫時無法刪除的情況,這個我們會一款非常好用的軟體Unlocker,那麼在Linux中類似的情況如何處理了?今天我們來學習lsof命令。
    lsof全稱list open files。用於查看進程打開的文件、目錄和套接字等信息。

基本用法

pidof [選項] [文件名]

其常用選項參數如下所示:

選項 說明
-?或-h 顯示幫助信息
-a 顯示打開文件存在的進程
-c 進程名 顯示指定進程所打開的文件
-d FD 顯示文件描述符(FD)占用的進程
+d 目錄名 顯示當前目錄下被打開的文件
+D 目錄名 遞歸顯示當前目錄下被打開的文件
-i 條件 顯示符合條件的進程
-p pid 顯示指定PID打開的文件
-u uid 顯示指定UID打開的文件
-g 顯示所屬組標識符PGID
R 顯示父進程PPID

其中選項 -i 支持的條件如下所示:

條件 說明 示例
4/6 IPv4/ IPv6 lsof -i
protocol UDP/TCP lsof -i TCP
hostname 網路主機名 lsof -i@localhost
hostaddr 網路地址 lsof [email protected]
service 服務名稱,可查看/etc/services lsof -i:ssh
port lsof -i:22

lsof輸出的詳細信息解釋如下:

  • COMMAND:進程名稱,如果名稱較長,則預設只顯示前9個字元
  • PID:進程標識符,如果添加-R參數,則顯示父進程PPID
  • USER:進程所有者,如果添加-g參數,則顯示組標識符PGID
  • FD:文件描述符
  • TYPE:文件類型,常見類型如下所示:
    DIR:表示目錄
    REG:表示普通文件
    CHR:表示字元類型
    BLK:表示塊設備類型
    UNIX:表示UNIX套接字
    FIFO:表示先進先出隊列
    IPv4:表示IPv4套接字
    IPv6:表示IPv6套接字

文件描述符FD,但卻可以表示兩類內容:

  • 第一類是文件描述符
    0:標準輸入
    1:標準輸出
    2:標準錯誤輸出
    n:其他文件描述符的數值

01文件描述符.jpg

  • 第二類描述文件特征的標識
    CWD:表示應用程式的當前工作目錄,即程式啟動的目錄
    txt:表示文件類型為程式代碼或數據
    mem:記憶體映射文件
    pd:父目錄
    rtd:根目錄
    DEL:表示文件已經刪除但還存在於記憶體中

用法示例

1、通過文件定位占用的進程

[root@localhost ~]# top -d 2 > top.txt
[root@localhost ~]# lsof top.txt
lsof:WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
  Output information may be incomplete.
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
top     8900 root    1w   REG    8,2    69035 469790741 top.txt

2、通過文件描述符定位進程

[root@localhost ~]# lsof -d 5 | head -3
lsof:WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
   Output information may be incomplete.
COMMAND  PID  USER   FD   TYPE      DEVICE SIZE/OFF NODE       NAME
systemd  1    root   5u   a_inode   0,10     0     7450       [signalfd]
Xvnc     2678 root   5u   IPv6      41776    0t0   TCP *:6003 (LISTEN)

3、通過進程定位文件

[root@localhost ~]# ps -ef |grep -i  mysql | grep -v grep
mysql 2680  1  2 7月19 ?  11:44:50 /usr/libexec/mysqld --basedir=/usr
[root@localhost ~]# lsof -p 2680 | head -3
lsof:WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
     Output information may be incomplete.
COMMAND  PID  USER   FD    TYPE  DEVICE SIZE/OFF  NODE   NAME
mysqld  2680  mysql  cwd   DIR   8,2    4096      319571 /var/lib/mysql
mysqld  2680  mysql  rtd   DIR   8,2    254       512    /

4、查看用戶打開的文件

[root@localhost ~]# lsof -u root | tail -3
lsof:WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
   Output information may be incomplete.
COMMAND   PID   USER  FD     TYPE DEVICE  SIZE/OFF NODE NAME
kworker/3 39337 root  cwd    DIR  8,2     254      512  /
kworker/3 39337 root  rtd    DIR  8,2     254      512  /
kworker/3 39337 root  txt   unknown                     /proc/39337/exe

5、查看程式所占用的埠

[root@localhost ~]# lsof -i:22
COMMAND PID    USER   FD  TYPE  DEVICE      SIZE/OFF NODE NAME
sshd    27597  root   3u  IPv4 1460505039   0t0      TCP *:ssh (LISTEN)
sshd    27597  root   4u  IPv6 1460505041   0t0      TCP *:ssh (LISTEN)

fuser

    fuser主要用於顯示進程正在使用的文件、套接字、掛載點等。

基本用法

fuser [選項] [文件名]

其常用選項如下所示:

選項 說明
-a ,--all 顯示命令行中指定的所有文件
-c 同-m選項,用於相容POSIX
-k, --kill 殺掉使用文件的進程
-i, --interactive 殺掉進程前需要用戶確認,如果無-k參數則預設忽略該參數
-l, --list-signals 顯示所有已知的 signal名稱
-m NAME, --mount NAME 指定一個掛載的文件系統或被掛載的設備
-n SPACE 指定一個不同的命名空間,支持不同的命名空間文件(預設為文件名)、UDP(本地UDP埠)、TCP(本地TCP埠),為避免歧義,可以使用name/space形式,如80/tcp
-w 僅殺掉擁有寫入許可權的進程,如果無-k參數則預設忽略該參數
-s, --silent 靜默模式,-u和-v忽略該參數
-u, --user 在PID後顯示所屬的用戶名
-v, --verbose 顯示詳細信息
-4, --ipv4 僅搜索IPv4的套接字
-6, --ipv6 僅搜索IPv6的套接字

fuser顯示指定文件或文件系統的進程PID,在預設模式中,每個文件名後面會用一個字母表示訪問類型,如下所示:

  • c:表示當前目錄
  • e:表示該文件為可執行文件
  • f:表示被打開的文件,預設模式中f不顯示
  • F:表示被打開的文件,用於寫入操作,預設模式中F不顯示
  • r:根目錄
  • m:映射文件或共用lib
-f 和 -F 只有與選項 -v 一起使用的時候才會顯示,其他情況則預設不顯示

用法示例

1、殺掉所有占用/home的進程

[root@localhost ~]# fuser -km /home

2、顯示本地所有mysql上埠進程

[root@localhost ~]# fuser mysql/tcp
mysql/tcp:            2680

3、顯示詳細的信息

[root@localhost ~]# fuser -v top.txt
                     用戶     進程號  許可權   命令
/root/top.txt:       root     15847 F....  top

4、查看有多個進程正在使用某個目錄下文件系統,包含子目錄

[root@localhost ~]# fuser -v -m /home/data
                     用戶     進程號 許可權   命令
/home/data:          root     kernel mount /home/data

5、通過埠定位進程

[root@localhost ~]# fuser -v -n tcp 22
                     用戶     進程號 許可權   命令
22/tcp:              root      27597 F.... sshd
                     root      31119 F.... sshd
或
[root@localhost ~]# fuser -v 22/tcp
                     用戶     進程號 許可權   命令
22/tcp:              root      27597 F.... sshd
                     root      31119 F.... sshd

fuser與lsof對比

對比項 fuser lsof
定位方式 通過文件查找進程 通過進程查找文件
所屬標準 POSIX -
參數類型 文件/網路埠 文件/PID/網路埠
進程輸出 PID PID詳細信息
是否可發送信息 可以,使用-k 不可以

ps

    在Windows系統中用於查看進程通常是通過任務管理器。而在Linux中,我們用ps(Process Status)命令來查看進程。

基本用法

ps [選項]

其常用選項如下所示:

選項 說明
-A 顯示所有進程,同選項-e
-a 顯示所有進程,但排除新會話的首進程和無控制終端的進程
-d 顯示所有進程,但排除新會話的首進程
-e 顯示所有進程,同選項-A
r 僅顯示正在運行的進程
-C cmdlist 顯示指定命令的進程信息
-p pidlist 顯示指定PID的進程
-t ttylist 顯示指定tty的進程
-u userlist 顯示指定有效用戶ID或名字的進程
-c 顯示CLS和PRI列
-f 添加詳細列信息,通常與其他選項聯合使用
-x 沒有關聯到終端上的進程也進行顯示
-o 僅顯示自定義的列
-l 僅顯示屬於當前登錄用戶的PID與相關信息列表
--sort spec 對輸出信息進行排序 + 升序排序 - 降序排序

用法示例

1、不帶參數的示例

[root@localhost ~]# ps
  PID TTY          TIME CMD
11047 pts/0    00:00:00 ps
24892 pts/0    00:00:00 su
25142 pts/0    00:00:00 bash

2、僅顯示與當前用戶相關的進程和相關信息

[root@localhost ~]# ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 R     0 22720 25142  0  80   0 - 38292 -      pts/0    00:00:00 ps
4 S     0 24892 22641  0  80   0 - 58599 do_wai pts/0    00:00:00 su
4 S     0 25142 24892  0  80   0 - 29305 do_wai pts/0    00:00:00 bash
  • F:表示進程標誌,說明當前進程的許可權,若為4表示進程許可權為root,若為1表示些子進程僅可進行複製(fork)而無法實際運行
  • S:表示進程狀態,主要狀態有:
      R:進程正在運行
      S:進程處於睡眠狀態,但可以被喚醒
      D:進程處於不可被喚醒的睡眠狀態,通常該進程可能在等待I/O
      T:停止狀態,可能是在工作控制或除錯狀態
      Z:僵屍狀態,進行已經終止但卻無法釋放記憶體等
  • UID/PID/PPID:進行的所屬UID/PID/PPID
  • C:CPU使用率,單位為%
  • PRI/NI:Priority/Nice縮寫,表示進程被CPU執行的優先順序,數值越小越快被CPU執行
  • ADDR:與記憶體相關,ADDR表示該進程在記憶體的哪個部分,如果是Running進程,會顯示 -
  • SZ:與記憶體相關,表示該進程使用了多少記憶體;
  • WCHAN:與記憶體相關,表示該進程目前是否正在運行,-表示正在運行中
  • TTY:啟動進程的終端名稱
  • TIME:進程的實際CPU占用時間之和,單位為秒
  • CMD:進程命令

3、查看系統所有進程

[root@localhost ~]# ps aux
USER PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root   2  0.0  0.0      0     0 ?        S    8月08   0:00 [kthreadd]
root   3  0.0  0.0      0     0 ?        S    8月08   0:03 [ksoftirqd/0]
root   5  0.0  0.0      0     0 ?        S<   8月08   0:00 [kworker/0:0H]
root   8  0.0  0.0      0     0 ?        S    8月08   0:00 [migration/0]
  • USER:進程所屬用戶
  • PID:進程標識符
  • %CPU:進程的CPU占比
  • %MEM:進程物理記憶體占比
  • VSZ:進程虛擬記憶體(KB)使用量
  • RSS:進程占用的固定記憶體量(KB)
  • TTY:啟動進程的終端名稱
  • STAT:進程狀態
  • START:進程啟動時間
  • TIME:進程的實際CPU占用時間之和
  • COMMAND:進程命令

在Linux中ps通常有三種不同的書寫格式

  • BSD格式:選項前不加短橫線 - ,多個選項可以組合使用如ps aux
  • UNIX格式:選項前加短橫線 -,多個選項可以組合使用如ps -aux
  • GNU長格式:選項前加雙短橫線 --,如 ps --context

因此ps aux 和ps -aux 在顯示的輸出信息是一樣的。

4、顯示自定義列

[root@localhost ~]# ps -eo pid,user,cmd
PID USER     CMD
  2 root     [kthreadd]
  3 root     [ksoftirqd/0]
  5 root     [kworker/0:0H]
  8 root     [migration/0]

5、對輸出結果進行排序

[root@localhost ~]# ps -ef --sort=uid,-ppid,+pid
UID  PID    PPID  C STIME TTY        TIME CMD
root 31637 31624  0 17:42 pts/1  00:00:00 less -s
root 40772 25142  0 17:44 pts/0  00:00:00 ps -ef --sort=uid,-ppid,+pid
root 40773 25142  0 17:44 pts/0  00:00:00 more
root 25142 24892  0 15:32 pts/0  00:00:00 bash
root 31624 24164  0 17:42 pts/1  00:00:00 man ps
root 24164 23955  0 15:32 pts/1  00:00:00 bash
root 23955 23586  0 15:32 pts/1  00:00:00 su root
root 24892 22641  0 15:32 pts/0  00:00:00 su root

pstree

    在使用ps查看進程十分方便,但若想查看詳細進程和子進程時,則需要使用pstree全命令。由於pstree不是系統自帶,需要自行安裝

yum -y install pstree

基本語法

pstree [選項]

常用選項如下所示:

選項 說明
-a 顯示每個進程的完整指令,包括路徑、參數等
-h 高亮顯示當前進程及父進程
-g 顯示PGID
-n 相同父進程下,按各自的PID進行排序
-p 顯示PID
-s 顯示父進程
-u username 顯示UID信息

kill

    在Windows系統中,當某個一個程式出現假死或無反應時,我們常常打開任務管理器,找到對應的進程,然後殺掉該進程。在命令行盛行的Linux中,我們該使用哪個命令?常用於殺掉進程的命令非kill莫屬了。

基本用法

kill [選項] [PID]

其常用選項如下所示:

選項 說明
-s signal 向目標進程發送指定的信號類型,信號可以為名稱或數字
-l 顯示信號名稱列表,如果在-l加編號則查看信號名稱,反之亦然
-a 處理當前進程時,不限制命令和PID的對應關係
-p 指定kill命令僅顯示相關進程的進程號,而不發送任何信號
  • 無選項:表示向目標進程發送預設的終止信號,即SIGTERM
  • PID>0:表示向目標進程發送信號,此處的PID可以是多個PID,用空格進行分隔
  • PID=0:表示向當前進程組的所有進程發送信號
  • PID=-1:表示向除當前 kill 進程和 init 進程之外的所有進程發送信號
  • PID<-1:表示向進程組PGID的所有進程發送信號,如-123,則向進程組PGID為123的所有進程發送信號

用法示例

1、顯示信號列表
02信號列表.jpg

除以上顯示信號,還有一個特殊的編號0為測試信號,其作用如下:

  • 用於測試目標進程是否存在
[root@localhost ~]# kill -l 0
T
[root@localhost ~]# kill -0 99999
bash: kill: (99999) - 沒有那個進程
  • 用於測試當前用戶是否擁有向該進程發送信號的許可權
[admin@localhost ~]# kill -0 2325
bash: kill: (2325) - 操作不被允許

2、查看信號對應的編號或名稱

[root@localhost ~]# kill -l SIGHUP
1
[root@localhost ~]# kill -l KILL
9
[root@localhost ~]# kill -l 9
KILL

在Linux中常用信號如下所示:

信號名稱 編號 解釋
HUP 1 終端斷線
INT 2 中斷(同Ctrl+C)
QUIT 3 退出(同Ctrl+)
KILL 9 強制終止
TEEM 15 終止
CONT 18 繼續(與STOP相反)
STOP 19 暫停(同Ctrl+Z)

3、強制終止進程

[root@localhost ~]# kill -9 26744
[root@localhost ~]# kill -kill 30470

在使用kill -9需要註意的事項如下所示:

  • kill不能殺死進程為1的init進程
  • 在使用kill -9時是強行終止進程且沒有通知目標進程進行自我清理,而是突然被中止,可以造成資源無法正常釋放,數據無法同步到磁碟等,在使用前需要三思

本文同步在微信訂閱號上發佈,如各位小伙伴們喜歡我的文章,也可以關註我的微信訂閱號:woaitest,或掃描下麵的二維碼添加關註:
MyQRCode.jpg


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 做項目時偶爾B類賦值給A類,碰巧A和B類型很多屬性欄位名是一樣的,或者只是大小寫不一樣,這是可以利用泛型,反射來寫一個自動化賦值的方法。 下麵方法不考慮大小寫不一樣的情況,如果要考慮,可以使用字元串方法 ToUpper() 、ToLower() 後,對比欄位名是否一樣。 值得註意的地方,屬性到底有沒 ...
  • 前言 今年是2018年,發現已經有4年沒有寫博客了,在這4年的時光里,接觸了很多的.NET技術,自己的技術也得到很大的進步。在這段時光裡面很感謝張隊長以及其他開發者一直對.NET Core開源社區做出的巨大貢獻,我也在其中學習到很多的知識,因此在這段時間我也開始記錄我的學習成果,供大家好好學習,以及 ...
  • 生成代理類步驟: 一:找到Visual Studio 的工具文件夾 二:用管理員方式打開本機工具命令提示 三:輸入要執行的腳本 wsdl /language:C# /n:xxxx.HermesMobileWebService /out:C:\BaServiceClient.cs http://hb- ...
  • 好吧,我又回來了,其實一直都想寫一篇關於EF core 的文章去記錄自己在開發時候遇到的問題。 EF core 就是字面上的意思咯,EF 就是.Net上用的很多的ORM框架,core呢,就是在.Net core 上使用的EF咯。 為什麼要使用EF框架呢,因為原始的ADO.NET需要編寫大量的數據訪問 ...
  • 插入排序,是迴圈遍歷一個無序數組(例如有10個元素),把遍歷出來的數值(第i個元素)插入到已經排過順序的數組(這個有序數組有10-i個元素)中。 用一個 數組 舉個例子: 初始數組:1, 89, 4, 34, 56, 40, 59, 60, 39, 1, 40, 90, 48 第一次迴圈(i=0): ...
  • 最近公司需要在伺服器上實現兩個音頻的合成及效果處理。 哇,乍一聽功能很簡單吧,就是將兩個音頻疊加,隨便一個媒體處理軟體幾秒鐘即可完成,但這僅僅只是針對單用戶而言而已。其次,本來這種服務原本就不應該在伺服器上面實現,為何? 流媒體處理是相當耗費伺服器資源的,包括IO,CPU,bandwidth等等。 ...
  • [TOC] 背景敘述 在前面幾篇 MEF 插件式開發 系列博客中,我分別在 和 兩種框架下實驗了 MEF 的簡單實驗,由於 由來已久,因此基於該框架下衍生出的很多優秀的 MEF 框架較多。但是對於 來說,情況有所不同,由於它本身對 DI 內置並提供支持,因此我嘗試使用它的全新 依賴註入(DI) 來做 ...
  • CentOS 7 建議在一個純凈的 centos7上進行下麵的安裝部署$ setenforce 0 # 臨時關閉,重啟後失效$ systemctl stop firewalld.service # 臨時關閉,重啟後失效# 修改字元集,否則可能報 input/output error的問題,因為日誌里 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...