所以我登录到Solaris框,尝试启动Apache,并发现已经有一个进程正在侦听端口80,而且它不是Apache.我们的盒子没有安装lsof,所以我不能用它来查询.我想我能做到:
pfiles `ls /proc` | less
并寻找"端口:80",但如果有人有更好的解决方案,我全都耳朵!如果我可以在没有root的情况下寻找听力过程,那就更好了.我对shell和C解决方案都持开放态度; 我不介意有一个小的自定义可执行文件随身携带,以便下次出现.
更新:我说的是solaris的通用安装我不是管理员(虽然我有超级用户访问权限),所以从免费软件磁盘安装东西不是一个选项.显然,两者都没有使用针对fuser,netstat或其他工具的特定于Linux的扩展.到目前为止,在所有进程上运行pfiles 似乎是最好的解决方案,不幸的是.如果仍然如此,我可能会发布一个答案,其中包含一些稍微更高效的代码.
我在某个地方找到了这个脚本.我不记得在哪里,但它对我有用:
#!/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]哪个进程绑定到给定端口?
这是一个单行:
ps -ef| awk '{print $2}'| xargs -I '{}' sh -c 'echo examining process {}; pfiles {}| grep 80'
'echo examine process PID'将在每次搜索之前打印,因此一旦你看到输出引用端口80,你就会知道哪个进程持有句柄.
或者使用:ps -ef| grep $USER|awk '{print $2}'| xargs -I '{}' sh -c 'echo examining process {}; pfiles {}| grep 80'
因为'pfiles'可能不喜欢你试图访问其他用户的进程,除非你当然是root.