什么进程正在监听 Solaris 上的某个端口?
Posted
技术标签:
【中文标题】什么进程正在监听 Solaris 上的某个端口?【英文标题】:What process is listening on a certain port on Solaris? 【发布时间】:2010-09-10 14:36:10 【问题描述】:于是我登录到一个 Solaris 盒子,尝试启动 Apache,发现已经有一个进程在监听 80 端口,而且不是 Apache。我们的盒子没有安装 lsof,所以我无法查询。我想我可以做到:
pfiles `ls /proc` | less
并寻找“端口:80”,但如果有人有更好的解决方案,我会全力以赴!如果我可以在没有 root 的情况下寻找聆听过程,那就更好了。我对 shell 和 C 解决方案都持开放态度;下次遇到这种情况时,我不介意随身携带一个小的自定义可执行文件。
更新:我说的是我不是管理员的 solaris 的通用安装(尽管我确实有超级用户访问权限),所以从免费软件磁盘安装东西不是一种选择。显然,两者都没有对 fuser、netstat 或其他工具使用特定于 Linux 的扩展。不幸的是,到目前为止,在 all 进程上运行 pfile 似乎是最好的解决方案。如果情况仍然如此,我可能会发布一个答案,其中包含一些比上面剪辑更有效的代码。
【问题讨论】:
@AlanHnetstat
不会告诉你过程。
在 Solaris 11.2 netstat -aun
中为您提供 pid 和命令。请参阅@nolan6000 的回答。
【参考方案1】:
我在某个地方找到了这个脚本。我不记得在哪里,但它对我有用:
#!/bin/ksh
line='---------------------------------------------'
pids=$(/usr/bin/ps -ef | sed 1d | awk 'print $2')
if [ $# -eq 0 ]; then
read ans?"Enter port you would like to know pid for: "
else
ans=$1
fi
for f in $pids
do
/usr/proc/bin/pfiles $f 2>/dev/null | /usr/xpg4/bin/grep -q "port: $ans"
if [ $? -eq 0 ]; then
echo $line
echo "Port: $ans is being used by PID:\c"
/usr/bin/ps -ef -o pid -o args | egrep -v "grep|pfiles" | grep $f
fi
done
exit 0
编辑:这是原始来源: [Solaris] Which process is bound to a given port ?
【讨论】:
这可行,但需要 root 才能让 pfiles 查询不属于当前用户的进程。 这里的主要警告!来自 pfiles 手册页:警告 以下 proc 工具会在检查目标进程并报告结果时停止它们:pfiles、pldd 和 pstack。进程在停止时不能做任何事情。在生产环境中停止大量使用的进程......可能会导致严重的瓶颈甚至这些进程的挂起,导致用户无法使用它们。 某些数据库也可能异常终止。因此,应避免在生产环境中停止 UNIX 进程。【参考方案2】:这是一个单行:
ps -ef| awk 'print $2'| xargs -I '' sh -c 'echo examining process ; pfiles | grep 80'
在每次搜索之前都会打印'echo checks process PID',所以一旦你看到一个引用端口80的输出,你就会知道哪个进程正在持有句柄。
或者使用:ps -ef| grep $USER|awk 'print $2'| xargs -I '' sh -c 'echo examining process ; pfiles | grep 80'
因为“pfiles”可能不喜欢你试图访问其他用户的进程,除非你当然是 root。
【讨论】:
第一行对我有用。【参考方案3】:Mavroprovato 的答案报告的不仅仅是监听端口。侦听端口是没有对等点的套接字。下面的 Perl 程序只报告监听端口。它适用于 SunOS 5.10。
#! /usr/bin/env perl
##
## Search the processes which are listening on the given port.
##
## For SunOS 5.10.
##
use strict;
use warnings;
die "Port missing" unless $#ARGV >= 0;
my $port = int($ARGV[0]);
die "Invalid port" unless $port > 0;
my @pids;
map push @pids, $_ if $_ > 0; map int($_) `ls /proc`;
foreach my $pid (@pids)
open (PF, "pfiles $pid 2>/dev/null |")
|| warn "Can not read pfiles $pid";
$_ = <PF>;
my $fd;
my $type;
my $sockname;
my $peername;
my $report = sub
if (defined $fd)
if (defined $sockname && ! defined $peername)
print "$pid $type $sockname\n"; ;
while (<PF>)
if (/^\s*(\d+):.*$/)
&$report();
$fd = int ($1);
undef $type;
undef $sockname;
undef $peername;
elsif (/(SOCK_DGRAM|SOCK_STREAM)/) $type = $1;
elsif (/sockname: AF_INET[6]? (.*) port: $port/)
$sockname = $1;
elsif (/peername: AF_INET/) $peername = 1;
&$report();
close (PF);
【讨论】:
【参考方案4】:#!/usr/bin/bash
# This is a little script based on the "pfiles" solution that prints the PID and PORT.
pfiles `ls /proc` 2>/dev/null | awk "/^[^ \\t]/smatch=\$0;next/port:[ \\t]*$1/print smatch, \$0next"
【讨论】:
【参考方案5】:从 Solaris 11.2 开始,您确实可以使用 netstat
命令执行此操作。看看here。 -u
开关就是您要找的。
如果您使用的是较低版本的 Solaris,那么 - 正如其他人所指出的 - Solaris 执行此操作的方式是某种围绕 pfiles
命令的脚本包装器。请注意,pfiles
命令会暂停该进程一秒钟以检查它。对于 99.9% 的流程,这并不重要。不幸的是,我们有一个进程会在遇到pfiles
命令时给出核心转储,因此我们对使用该命令有点谨慎。如果您在 99.9% 中,您的情况可能会完全不同,这意味着您可以安全地使用 pfiles
命令。
【讨论】:
是的。我站得更正。我已经更新了答案。谢谢。【参考方案6】:Solaris 上的 netstat 不会告诉您这一点,旧版本的 lsof 也不会,但如果您下载并构建/安装新版本的 lsof,它可以告诉您。
$ lsof -v
lsof version information:
revision: 4.85
latest revision: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/
latest FAQ: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ
latest man page: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof_man
configuration info: 64 bit kernel
constructed: Fri Mar 7 10:32:54 GMT 2014
constructed by and on: user@hostname
compiler: gcc
compiler version: 3.4.3 (csl-sol210-3_4-branch+sol_rpath)
8<- - - - ***SNIP*** - - -
有了这个,你可以使用 -i 选项:
$ lsof -i:22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 521 root 3u IPv6 0xffffffff89c67580 0t0 TCP *:ssh (LISTEN)
sshd 5090 root 3u IPv6 0xffffffffa8668580 0t322598 TCP host.domain.com:ssh->21.43.65.87:52364 (ESTABLISHED)
sshd 5091 johngh 4u IPv6 0xffffffffa8668580 0t322598 TCP host.domain.com:ssh->21.43.65.87:52364 (ESTABLISHED)
它准确地显示了您的要求。
昨天我遇到了一个崩溃的 Jetty (Java) 进程的问题,该进程在其 /proc/[PID] 目录中只留下了 2 个文件(psinfo 和用法)。
pfiles 找不到进程(因为它需要的日期不存在)
lsof 帮我找到了。
【讨论】:
我愿意lsof -P -i -n | grep LISTEN
【参考方案7】:
您可能不想这样做,但最好的办法是获取 sunfreeware CD 并安装 lsof。
除此之外,是的,您可以使用 shell 脚本在 /proc 中进行操作。
【讨论】:
Sun 的 lsof 实现是否会停止目标进程(如 pfiles 等,是否会停止?) @Randall:我不知道,因为我不再能够轻松访问 solaris 系统。我会怀疑——它不是由 sun 编写的,不像 p* 工具。【参考方案8】:我认为第一个答案是最好的 我编写了自己的 shell 脚本来开发这个想法:
#!/bin/sh
if [ $# -ne 1 ]
then
echo "Sintaxis:\n\t"
echo " $0 port to search in process "
exit
else
MYPORT=$1
for i in `ls /proc`
do
pfiles $i | grep port | grep "port: $MYPORT" > /dev/null
if [ $? -eq 0 ]
then
echo " Port $MYPORT founded in $i proccess !!!\n\n"
echo "Details\n\t"
pfiles $i | grep port | grep "port: $MYPORT"
echo "\n\t"
echo "Process detail: \n\t"
ps -ef | grep $i | grep -v grep
fi
done
fi
【讨论】:
你的脚本可以大大简化,见***.com/questions/13246309/…【参考方案9】:很可能是 sun 的管理服务器.. 它通常与 sun 的目录以及默认安装中的一些其他 webmin-ish 东西捆绑在一起
【讨论】:
【参考方案10】:这是一种间接的方法,但是您可以从端口 80 上运行的任何内容中查看网站是否加载到您选择的 Web 浏览器上。或者您可以远程登录到端口 80 并查看是否得到响应关于该端口上正在运行的内容的线索,您可以将其关闭。由于端口 80 是 http 流量的默认端口,因此默认情况下可能会在那里运行某种 http 服务器,但不能保证。
【讨论】:
【参考方案11】:如果您有权访问netstat
,则可以做到这一点。
【讨论】:
不幸的是,它不会在 solaris 上。您可以使用它来显示所有打开的套接字及其状态,但不能显示打开它们的进程。以上是关于什么进程正在监听 Solaris 上的某个端口?的主要内容,如果未能解决你的问题,请参考以下文章