используйте следующую команду для запуска команды в фоновом режиме, она отсоединяется от терминала
nohup command &
или, если выполняется команда от терминала, для установки в фоновом режиме do:
command
затем ctrl + z
на клавиатуре, чтобы приостановить текущий process, затем введите:
bg
, чтобы перевести приостановленный процесс в фоновый режим. введите:
jobs
, чтобы просмотреть текущие задания, включая фоновый процесс. введите:
fg %n
, где n
в номере задания из команды jobs
.
команда nohup &
легко может быть написана сценарием.
Другое возможное решение:
lsof -t -i :<port> -s <PROTO>:LISTEN
Например:
# lsof -i :22 -s TCP:LISTEN
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1392 root 3u IPv4 19944 0t0 TCP *:ssh (LISTEN)
sshd 1392 root 4u IPv6 19946 0t0 TCP *:ssh (LISTEN)
# lsof -t -i :22 -s TCP:LISTEN
1392
Prueba esto:
pid=$(fuser 3000/tcp 2>/dev/null)
(requiere psmisc
paquete)
Tenga en cuenta que esto es confiable solo cuando lo ejecuta el usuario root. Otros usuarios solo pueden esperar encontrar procesos ejecutándose con el mismo usuario.
Explicación aburrida para el acceso solo a la raíz con un ejemplo aquí.
Cualquiera que sea el método utilizado (fuser, ss, lsof,... ), todos terminan haciendo coincidir la lista disponible de descriptores de procesos con una lista disponible de conexiones de red (, por ejemplo, para tcp está disponible en/proc/net/tcp
).
Por ejemplo,intentar obtener el pid usando el puerto22/tcp
(con 22 = 0x0016 )terminaría haciendo este tipo de comparación:
Entrada desde/proc/net/tcp
:0: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 141408 1 000000000a9ac1b5 100 0 0 10 0
con:dr-x------. 2 root root 0 May 14 17:59 /proc/358/fd
lrwx------. 1 root root 64 May 14 17:59 /proc/358/fd/3 -> socket:[141408]
Como este descriptor fd solo está disponible para su usuario (que resulta ser root en este ejemplo )o root, solo ese usuario o root puede descubrir que el pid es 358.
Si bien el -t
de lsof
es la forma más sencilla de obtener el PID, lsof
también tiene formas de seleccionar otros campos usando la opción -F
:
$ lsof -F'?'
lsof: ID field description
a access: r = read; w = write; u = read/write
c command name
d device character code
D major/minor device number as 0x<hex>
f file descriptor (always selected)
G file flaGs
i inode number
k link count
K task ID (TID)
l lock: r/R = read; w/W = write; u = read/write
L login name
m marker between repeated output
n comment, name, Internet addresses
o file offset as 0t<dec> or 0x<hex>
p process ID (PID)
g process group ID (PGID)
P protocol name
r raw device number as 0x<hex>
R paRent PID
s file size
S stream module and device names
t file type
T TCP/TPI info
u user ID (UID)
0 (zero) use NUL field terminator instead of NL
Con una salida como esta (tenga en cuenta que los descriptores de archivo y PID siempre se imprimen):
$ sudo lsof -F cg -i :22 -s TCP:LISTEN
p901
g901
csshd
f3
f4
Entonces, si quisiera la ID del grupo de procesos en lugar del PID, podría hacer:
$ sudo lsof -F g -i :22 -s TCP:LISTEN | awk '/^g/{print substr($0, 2)}'
901
Advertencia :Solo puedo probar esto en RedHat.
¿Debería ser posible con netstat
?
sudo netstat -npl --inet | awk '/:3000/' | awk -F "[ /]+" '{print $7}'
-n para puertos numéricos
-l para puertos de escucha
-p para ver los PID
Puede usar los interruptores--inet o--inet6 para decirle a netstat
que solo mire para IPv4 o IPv6 respectivamente; de lo contrario, podría obtener dos resultados.
Alternativamente, puede decirle a awk
que imprima solo una vez
sudo netstat -npl | awk '/:3000/' | awk -F "[ /]+" '{print $7; exit}'
En awk
solo usamos ' / ' de la salida de netstat
de PID/programa como separador.
Esto es exactamente lo que necesitas
sudo lsof -n -i :3000 | awk '/LISTEN/{print $2}'
12726
12730
12732