首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Linux 進程查找腳本:通過 /proc 文件系統匹配進程名稱

     編輯:Java 相關知識

腳本功能

該 Perl 腳本通過掃描 /proc 文件系統下的進程目錄,讀取每個進程的 cmdline 文件,匹配指定的進程名稱並輸出對應的 PID。適用於系統管理、進程監控、自動化運維場景。

完整腳本代碼

#!/usr/bin/perl
use strict;
use warnings;

# usage: process_grep.pl ProcessName
exit(main(@ARGV));

sub main {
    my $Phash;
    my $ProcessName = shift;
    my $PROC_DIR = "/proc";
    
    chdir $PROC_DIR;
    my @pids = glob "[0-9]*";  # 獲取所有數字目錄(PID)
    
    for my $pid (@pids) {
        open(FH, "$pid/cmdline") or die "Can't open $pid file: $!";
        $Phash->{$pid} = $_ while ;  # 讀取命令行參數
        close FH;
    }
    
    delete $Phash->{"$$"};  # 排除當前腳本進程
    
    for my $pid (keys %$Phash) {
        print $pid, "\n" if $Phash->{$pid} =~ /$ProcessName/;
    }
    
    return 0;
}

核心原理解析

/proc 文件系統

Linux 內核通過 /proc 虛擬文件系統暴露進程信息:

  • /proc/[PID]/cmdline:進程啟動命令行參數(以空字符分隔)
  • /proc/[PID]/status:進程狀態信息
  • /proc/[PID]/exe:可執行文件符號鏈接

關鍵技術點

  1. glob "[0-9]*":高效獲取所有數字命名的進程目錄
  2. 哈希表存儲:$Phash->{$pid} = cmdline 結構便於後續匹配
  3. 正則匹配:$Phash->{$pid} =~ /$ProcessName/ 支持模糊匹配
  4. 自我排除:delete $Phash->{"$$"} 避免匹配到自身進程

使用示例

# 查找名稱包含 "nginx" 的進程
perl process_grep.pl nginx

# 輸出示例
1234
5678
9012

優化與擴展建議

  • 精確匹配:使用 /\b$ProcessName\b/ 避免部分匹配誤報
  • 輸出更多信息:結合 /proc/[PID]/status 獲取內存、CPU、用戶等信息
  • 性能優化:大量進程時可考慮 C 實現或使用 pgrep 系統命令
  • 跨平台兼容:非 Linux 系統需檢查 /proc 可用性

對比系統工具

工具優點缺點
pgrep/pkill系統內置、性能高、語法豐富功能固定、難以自定義邏輯
ps + grep通用、輸出格式可控需解析文本、易誤匹配 grep 自身
本腳本邏輯可定制、直接讀取內核數據、無管道開銷需 Perl 環境、非標準工具

總結

該腳本展示了通過 /proc 文件系統直接訪問進程元數據的經典模式,邏輯清晰、易於擴展。理解其原理有助於深入掌握 Linux 進程管理機制,也為開發更複雜的系統監控工具奠定基礎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved