31. Perl 脚本实战-psnetstat

梦里梦外; 2022-01-27 22:25 336阅读 0赞

psgrep 命令用于查询端口被那个进程占用, 主要特性:

  • 支持通过端口号快速查询占用当前端口的进程
  • 支持一次性查询多个端口号的占用进程
  • 查询列表会展示netstat 命令 与ps 命令的综合信息
  • 需要sudo 权限或root 用户执行

1. 用法示例

1.1 查询单个进程

  1. $ psnetstat 7481
  2. [1] tcp 0 0 127.0.0.1:7481 0.0.0.0:* LISTEN 31685/redis-server
  3. zongf 31685 1311 0 13:37 ? 00:00:12 redis-server 127.0.0.1:7481 [cluster]

1.2 查询多个关键字

  1. $ psnetstat 7481 7482
  2. [1] tcp 0 0 127.0.0.1:7481 0.0.0.0:* LISTEN 31685/redis-server
  3. zongf 31685 1311 0 13:37 ? 00:00:12 redis-server 127.0.0.1:7481 [cluster]
  4. [2] tcp 0 0 127.0.0.1:7482 0.0.0.0:* LISTEN 31690/redis-server
  5. zongf 31690 1311 0 13:37 ? 00:00:13 redis-server 127.0.0.1:7482 [cluster]

2. 命令源码

  1. #!/usr/bin/perl
  2. #Desc 查询本机监听端口号对应的服务
  3. #Auth zonggf
  4. #Date Tue Dec 13 19:15:00 CST 2016
  5. use Term::ANSIColor qw(:constants);
  6. $Term::ANSIColor::AUTORESET = 1;
  7. #检查是否是查询帮助
  8. sub check_help{
  9. my $param = $ARGV[0];
  10. if("-h" eq $param || "--help" eq $param){
  11. print BOLD BLUE "Desc: "; print "查询占用指定端口的应用程序\n";
  12. print BOLD BLUE "Args: "; print "一个或多个端口号,支持模糊查询\n";
  13. print BOLD BLUE "Exam: "; print "psnetstat 22 8380\n";
  14. print BOLD BLUE "Auth: "; print "zonggf\n";
  15. print BOLD BLUE "Date: "; print "2016-12-22 18:57:16\n";
  16. exit;
  17. }
  18. }
  19. #格式化索引长度
  20. #参数: 接收两个参数
  21. # para1: 需要格式化的索引
  22. # para2: 数组长度
  23. #返回: [1 ]
  24. sub fmt_idx{
  25. return shift @_ if @_ < 2;
  26. my ($str, $array_length) = @_;
  27. my $length = length $array_length;
  28. return sprintf "[%-${length}s] ", $str;
  29. }
  30. #################### 主程序 ####################
  31. &check_help;
  32. #进行端口号拼接
  33. @patterns = @ARGV;
  34. $ports = ":";
  35. $ports .= shift @ARGV;
  36. foreach (@ARGV){
  37. $ports .="|:$_";
  38. }
  39. #如果参数不为空,则进行筛选
  40. $netstat_cmd = 'sudo netstat -tlunp | grep LISTEN';
  41. $netstat_cmd .= " | grep -E \"" . $ports ."\"" if defined $ports;
  42. @lines = `$netstat_cmd`;
  43. $lines_length = @lines;
  44. foreach $idx (1 .. @lines){
  45. $line = $lines[$idx-1];
  46. #输出netstat 信息
  47. printf BOLD GREEN &fmt_idx($idx, $lines_length) . $line;
  48. #获取端口号
  49. $idx = index ($line , '/');
  50. $line = substr($line, 0, $idx);
  51. ($port,$net_pid) = (split(/\s+/,$line))[3,-1];
  52. #查询占用端口号的进程
  53. if($net_pid){
  54. @ps_lines = `ps -ef | grep -v grep | grep -v /usr/bin/perl | grep $net_pid` if $net_pid;
  55. foreach(@ps_lines){
  56. $ps_pid = (split/\s+/, $_)[1];
  57. print if $ps_pid eq $net_pid;
  58. }
  59. }
  60. print "\n";
  61. }

发表评论

表情:
评论列表 (有 0 条评论,336人围观)

还没有评论,来说两句吧...

相关阅读

    相关 34. Perl 脚本实战-rscpup

    rscpdown 用于免交互从远程服务器上下载文件, 不能下载多个文件。 命令使用说明: 命令依赖expect 环境 命令携带用户名和密码, 无须交互 文件