我有一个遗留应用程序(我无法控制),如果没有正确关闭它正在侦听的端口,它偶尔会崩溃。是否有 Solaris 命令可以停止侦听给定端口,无需重新启动机器?
答案1
嗯。您需要找到变成僵尸进程或不再可用的进程,才能找到仍然打开的端口。如果您知道进程名称或 PID,那么使用 、 和 等命令会非常pfiles
有preap
帮助pkill
。
我有一个脚本可以搜索 PID 或进程名称以查找开放端口。
#!/usr/bin/ksh -p
process=$1
# if $1 is all numbers, then assume it's a PID, and get the parent process.
if [[ $process = +([0-9]) ]]; then
for pid in $( ptree $process | grep '^[0-9]' | awk '{print $1}' ); do
pfiles $pid | egrep "^$pid:|sockname"
done
else
# if $1 is/has letters, then assume it's a process name, and grep accordingly.
for pid in $( ptree | grep $process | grep '^[0-9]' | awk '{print $1}' ); do
pfiles $pid | egrep "^$pid:|sockname"
done
fi
这将打印 PID、进程名以及为匹配 $1 的任何进程打开的任何套接字。
一旦您确切地知道哪个 PID 使该套接字保持打开状态并且不可用,您可以使用pkill
或preap
命令之一强制关闭该 PID 及其打开的文件描述符。
答案2
如果端口仍处于侦听状态,则应用程序仍在以某种方式运行。使用命令lsof-i检查哪个进程仍在监听并杀死它。
如果您没有拉索夫安装工具后,您必须搜索聚苯乙烯-EF对于仍在运行的应用程序进程。