該 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;
}
Linux 內核通過 /proc 虛擬文件系統暴露進程信息:
/proc/[PID]/cmdline:進程啟動命令行參數(以空字符分隔)/proc/[PID]/status:進程狀態信息/proc/[PID]/exe:可執行文件符號鏈接$Phash->{$pid} = cmdline 結構便於後續匹配$Phash->{$pid} =~ /$ProcessName/ 支持模糊匹配delete $Phash->{"$$"} 避免匹配到自身進程# 查找名稱包含 "nginx" 的進程
perl process_grep.pl nginx
# 輸出示例
1234
5678
9012
/\b$ProcessName\b/ 避免部分匹配誤報/proc/[PID]/status 獲取內存、CPU、用戶等信息pgrep 系統命令/proc 可用性| 工具 | 優點 | 缺點 |
|---|---|---|
| pgrep/pkill | 系統內置、性能高、語法豐富 | 功能固定、難以自定義邏輯 |
| ps + grep | 通用、輸出格式可控 | 需解析文本、易誤匹配 grep 自身 |
| 本腳本 | 邏輯可定制、直接讀取內核數據、無管道開銷 | 需 Perl 環境、非標準工具 |
該腳本展示了通過 /proc 文件系統直接訪問進程元數據的經典模式,邏輯清晰、易於擴展。理解其原理有助於深入掌握 Linux 進程管理機制,也為開發更複雜的系統監控工具奠定基礎。