lsof -i: 4444
deve listar os processos usando 4444. Você deve iniciá-lo como root ou via sudo para evitar a saída restrita a mostrar apenas os processos do seu id.
Estou usando a seguinte versão do Linux
[davea@mydevbox ~]$ uname -a
Linux mydevbox.mydomain.com 5.7.8-35.36.amzn1.x86_64 #1 SMP Wed Mar 16 17:15:34 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
Eu quero descobrir o comando que iniciou um processo que escuta em uma porta específica. Idealmente, gostaria de descobrir de onde esse comando está sendo executado. Mas parece que não consigo identificar o comando. Usando o nmap eu posso dizer que é um servidor Jetty ...
[davea@mydevbox ~]$ nmap -sV -p 4444 localhost
Starting Nmap 6.40 ( http://nmap.org ) at 2016-04-07 20:54 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00020s latency).
PORT STATE SERVICE VERSION
4444/tcp open http Jetty 5.1.x (Linux/4.4.5-15.26.amzn1.x86_64 amd64 java/1.7.0_79)
Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.25 seconds
Existe alguma maneira de descobrir qual comando gerou o servidor Jetty?
Obrigado, - Dave
Editar: aqui está a saída para a sugestão dada.
[davea@mydevbox ~]$ sudo lsof -i :4444
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 2140 root 10u IPv6 9994 0t0 TCP *:krb524 (LISTEN)
[davea@mydevbox ~]$ sudo ps -p $(pidof java) -o args
ERROR: Process ID list syntax error.
********* simple selection ********* ********* selection by list *********
-A all processes -C by command name
-N negate selection -G by real group ID (supports names)
-a all w/ tty except session leaders -U by real user ID (supports names)
-d all except session leaders -g by session OR by effective group name
-e all processes -p by process ID
-q by process ID (unsorted & quick)
T all processes on this terminal -s processes in the sessions given
a all w/ tty, including other users -t by tty
g OBSOLETE -- DO NOT USE -u by effective user ID (supports names)
r only running processes U processes for specified users
x processes w/o controlling ttys t by tty
*********** output format ********** *********** long options ***********
-o,o user-defined -f full --Group --User --pid --cols --ppid
-j,j job control s signal --group --user --sid --rows --info
-O,O preloaded -o v virtual memory --cumulative --format --deselect
-l,l long u user-oriented --sort --tty --forest --version
-F extra full X registers --heading --no-heading --context
--quick-pid
********* misc options *********
-V,V show version L list format codes f ASCII art forest
-m,m,-L,-T,H threads S children in sum -y change -l format
-M,Z security data c true command name -c scheduling class
-w,w wide output n numeric WCHAN,UID -H process hierarchy
[davea@mydevbox ~]$
Existem muitas maneiras. Um simples envolve ss
:
# ss -lntp | grep 22
LISTEN 0 128 *:22 *:* users:(("sshd",1100,3))
LISTEN 0 128 :::22 :::* users:(("sshd",1100,4))
As opções significam: -l
exibir portas nas quais um processo está atendendo, -n
não resolver nomes, -t
considerar apenas portas TCP, -p
exibir o processo atendendo nessa porta. Nesse caso, você identifica o nome do processo ( sshd
, dificilmente surpreendente) e o ID do processo, 1100. Para uma porta UDP, o comando acima deve ser convertido para ss -lnup
.
Ou você pode usar lsof
:
# lsof -i :22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1100 root 3u IPv4 10089 0t0 TCP *:22 (LISEN)
sshd 1100 root 4u IPv6 10091 0t0 TCP *:22 (LISTEN
Para uma porta UDP, o comando deve ser lsof -i UDP:22
.
Por último, se você quiser ver a linha de comando completa que iniciou um determinado processo, faça o seguinte:
# ps -p $(pidof sshd) -o args
COMMAND
/usr/sbin/sshd -D
Neste caso, o comando inteiro não é muito informativo, mas ocasionalmente pode ser: você conhece todos os argumentos na invocação do seu servidor X?
# ps -p $(pidof X) -o args
COMMAND
/usr/bin/X -core :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch
Se você quiser aprender mais, como qual cadeia de processos iniciou o programa em questão, que pode apontar para o usuário que iniciou o programa, use
ps auxf
que mostrará, no lado direito, a cadeia de garfos que leva a um programa em execução no momento, com muitas informações também.
Uma vez que você sabe o ID do processo, PID
, você pode encontrar all da informação disponível para o sistema no diretório /proc/PID
, a parte complicada é que a informação não é imediatamente -Explanatorio. Se você tiver interesse, este artigo fornece mais informações, caso contrário use man proc
.
Por último, lembre-se que esta informação não está definida: os programas podem alterar pelo menos uma parte da sua própria informação, veja por exemplo esta resposta no ServerFault .