Je me connecte donc à une boîte Solaris, j'essaie de démarrer Apache et je constate qu'il existe déjà un processus d'écoute sur le port 80, et ce n'est pas Apache. Nos boîtes n'ont pas lsof installé, donc je ne peux pas interroger avec ça. Je suppose que je pourrais faire:
pfiles `ls /proc` | less
et cherchez "port: 80", mais si quelqu'un a une meilleure solution, je suis à l'écoute! Encore mieux si je peux rechercher le processus d'écoute sans être root. Je suis ouvert aux solutions Shell et C; Cela ne me dérangerait pas d'avoir un petit exécutable personnalisé à emporter avec moi pour la prochaine fois.
Mise à jour: je parle d'installations génériques de solaris pour lesquelles je ne suis pas l'administrateur (bien que j'aie un accès superutilisateur), donc installer des choses à partir du disque du freeware n'est pas une option. De toute évidence, ni l'un ni l'autre n'utilisent d'extensions spécifiques à Linux pour l'unité de fusion, netstat ou d'autres outils. Jusqu'à présent, l'exécution de pfiles sur tous processus semble malheureusement être la meilleure solution. Si cela reste le cas, je posterai probablement une réponse avec un code légèrement plus efficace que le clip ci-dessus.
J'ai trouvé ce script quelque part. Je ne me souviens pas où, mais cela fonctionne pour moi:
#!/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
Edit: Voici la source d'origine: [Solaris] Quel processus est lié à un port donné?
Voici une ligne:
ps -ef| awk '{print $2}'| xargs -I '{}' sh -c 'echo examining process {}; pfiles {}| grep 80'
'echo examining process PID' sera imprimé avant chaque recherche, donc une fois que vous verrez une sortie référençant le port 80, vous saurez quel processus tient la poignée.
ps -ef| grep $USER|awk '{print $2}'| xargs -I '{}' sh -c 'echo examining process {}; pfiles {}| grep 80'
Étant donné que 'pfiles' peut ne pas aimer cela, vous essayez d'accéder aux processus d'autres utilisateurs, sauf si vous êtes root, bien sûr.
La réponse de Mavroprovato rapporte plus que seulement les ports d'écoute. Les ports d'écoute sont des sockets sans homologue. Le programme Perl suivant ne signale que les ports d'écoute. Cela fonctionne pour moi sur 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); }
À partir de Solaris 11.2, vous pouvez en effet le faire avec la commande netstat
. Jetez un oeil ici . Le -u
switch est ce que vous recherchez.
Si vous utilisez une version inférieure de Solaris, alors - comme d'autres l'ont souligné - la façon de procéder de Solaris est une sorte de wrapper de script autour de la commande pfiles
. Attention cependant que la commande pfiles
arrête le processus pendant une fraction de seconde afin de l'inspecter. Pour 99,9% des processus, cela n'a pas d'importance. Malheureusement, nous avons un processus qui donnera un vidage de mémoire s'il est frappé avec une commande pfiles
donc nous sommes un peu prudents quant à l'utilisation de la commande. Votre situation peut être totalement différente si vous êtes dans le 99,9%, ce qui signifie que vous pouvez utiliser en toute sécurité la commande pfiles
.
netstat sur Solaris ne vous le dira pas, pas plus que les anciennes versions de lsof, mais si vous téléchargez et construisez/installez une version plus récente de lsof, cela peut vous le dire.
$ 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*** - - -
Avec cela, vous pouvez utiliser l'option -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)
Ce qui vous montre exactement ce que vous demandez.
J'ai eu un problème hier avec un processus Jetty (Java) bloqué, qui n'a laissé que 2 fichiers dans son répertoire/proc/[PID] (psinfo & usage).
pfiles n'a pas trouvé le processus (car la date dont il avait besoin n'était pas là)
lsof l'a trouvé pour moi.
#!/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, \$0}{next}"
Vous ne le voudrez peut-être pas, mais votre meilleur pari est de saisir le CD sunfreeware et d'installer lsof.
En dehors de cela, oui, vous pouvez vous déplacer dans/proc avec un script Shell.
Le serveur d'administration de Sun le plus problématique .. Il est généralement fourni avec le répertoire de Sun et quelques autres trucs webmin qui sont dans l'installation par défaut
Il s'agit en quelque sorte d'une approche indirecte, mais vous pouvez voir si un site Web se charge sur le navigateur Web de votre choix à partir de ce qui s'exécute sur le port 80. Ou vous pouvez telnet sur le port 80 et voir si vous obtenez une réponse qui vous donne un indice à ce qui fonctionne sur ce port et vous pouvez l'arrêter. Étant donné que le port 80 est le port par défaut pour le trafic http, il existe une sorte de serveur http qui y fonctionne par défaut, mais il n'y a aucune garantie.
Je pense que la première réponse est la meilleure que j'ai écrite mon propre script Shell en développant cette idée:
#!/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