fuser vs lsof para verificar los archivos en uso

fuser vs lsof para verificar los archivos en uso

He estado recibiendo algunas sugerencias sobre cómo averiguar por qué mi puerto serie está ocupado. Específicamente, cuando intento iniciar gammu-smsd, se niega a iniciar en /dev/ttyS0 porque dice que el puerto está ocupado:

sudo /etc/init.d/gammu-smsd start
Sep 30 16:16:51 porkypig gammu-smsd[25355]: Starting phone communication...
Sep 30 16:16:51 porkypig gammu-smsd[25355]: gammu: [Gammu            - 1.26.1 built 21:46:06 Nov 24 2009 using GCC 4.4]
Sep 30 16:16:51 porkypig gammu-smsd[25355]: gammu: [Connection       - "at115200"]
Sep 30 16:16:51 porkypig gammu-smsd[25355]: gammu: [Connection index - 0]
Sep 30 16:16:51 porkypig gammu-smsd[25355]: gammu: [Model type       - ""]
Sep 30 16:16:51 porkypig gammu-smsd[25355]: gammu: [Device           - "/dev/ttyS0"]
Sep 30 16:16:51 porkypig gammu-smsd[25355]: gammu: [Runing on        - Linux, kernel 2.6.32-42-server (#95-Ubuntu SMP Wed Jul 25 16:10:49 UTC 2012)]
Sep 30 16:16:51 porkypig gammu-smsd[25355]: gammu: [System error     - open in serial_open, 16, "Device or resource busy"]
Sep 30 16:16:51 porkypig gammu-smsd[25355]: gammu: Init:GSM_TryGetModel failed with error DEVICEOPENERROR[2]: Error opening device. Unknown, busy or no permissions.
Sep 30 16:16:51 porkypig gammu-smsd[25355]: Can't open device (Error opening device. Unknown, busy or no permissions.:2)
Sep 30 16:16:51 porkypig gammu-smsd[25355]: Using PGSQL service
Sep 30 16:16:51 porkypig gammu-smsd[25355]: Disconnecting from PostgreSQL

Usé dos comandos diferentes. Ambos consideran culpables procesos diferentes. Primero pruebo el fusor:

fuser -m -u /dev/ttyS0 
/dev/ttyS0:          21624(guarddoggps)
cd /proc/21624
cat status
Name:   dropbox
State:  S (sleeping)
Tgid:   21624
Pid:    21624
PPid:   1
TracerPid:  0
Uid:    1001    1001    1001    1001
Gid:    1001    1001    1001    1001
FDSize: 64
Groups: 5 27 1001 5004 
VmPeak:   873732 kB
VmSize:   806040 kB
VmLck:         0 kB
VmHWM:    207668 kB
VmRSS:    131864 kB
VmData:   547820 kB
VmStk:       160 kB
VmExe:      3524 kB
VmLib:     29660 kB
VmPTE:      1244 kB
Threads:    21
SigQ:   0/16382
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000001001000
SigCgt: 00000001800004c8
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: ffffffffffffffff
Cpus_allowed:   ff
Cpus_allowed_list:  0-7
Mems_allowed:   00000000,00000001
Mems_allowed_list:  0
voluntary_ctxt_switches:    202
nonvoluntary_ctxt_switches: 1

Entonces Fuser dice que Dropbox lo está usando.

Entonces uso lsof:

sudo lsof | grep ttyS0
screen    23520        root    6u      CHR               4,64         0t0       1421 /dev/ttyS0

lsof dice que la pantalla (en lugar de Dropbox) lo está usando.

Entonces, ¿cuál de estos programas (Dropbox o Screen) está realmente provocando que gammu-smsd se niegue a iniciarse debido a que los recursos están "ocupados"?

Respuesta1

La respuesta corta es: screen.

La respuesta un poco más larga es que la -mbandera fuserle dice que enumere todo usando elpunto de montaje. Dependiendo de su configuración, eso probablemente signifique todo /dev, pero también podría ser /. Claramente no es lo que pretendías. Obtendrá una lista muy larga si lo hace fuser -vm /dev/ttyS0, más de 60 líneas en mi sistema.

Quítese el -my probablemente le dará la misma respuesta que lsofle dio.

Respuesta2

Cuando intenté ejecutar gammu-smsd como demonio, mi syslog (en el que escribe el demonio) indicó que el puerto /dev/ttyS0 estaba actualmente abierto y en uso.

Entonces, para descubrir qué lo estaba usando, inicialmente ejecuté

fuser -m -u /dev/ttyS0 

Sin embargo, ese modificador -m dio una respuesta engañosa porque, como dijo @derobert, enumera todo lo que utiliza el punto de montaje.

Fue el comando lsof el que informó correctamente el proceso utilizando el puerto especificado:

sudo lsof | grep ttyS0
screen    23520        root    6u      CHR               4,64         0t0       1421 /dev/ttyS0

Ahora intenté eliminar la sesión de pantalla gnu de forma limpia:

screen -ls
There is a screen on:
    23520.pts-6.porkypig    (09/30/2013 02:49:47 PM)    (Detached)
1 Socket in /var/run/screen/S-root.
screen -S 21200.pts-1.porkypig -X quit

Mientras eso salía de la sesión, el proceso seguía vivo:

$ cd /proc/23520
$ head -n 1 status
    screen

y:

     $ ps aux | grep 23520
zsh: correct 'aux' to 'auxv' [nyae]? n
root      5111  0.0  0.0   4348   784 pts/7    S+   16:20   0:00 strace -p 23520
1001      5574  0.0  0.0   7636   920 pts/4    S+   17:51   0:00 grep 23520
root     23520  0.0  0.0  25604  1532 ?        Ss   Sep30   0:00 SCREEN /dev/ttyS0 115200

Entonces maté el proceso en sí:

# kill 23520
# ps aux | grep 23520
  root      5665  0.0  0.0   7636   916 pts/4    S+   17:54   0:00 grep 23520

Y finalmente el proceso terminó.

Ahora comencé con la gama:

sudo /etc/init.d/gammu-smsd start

Y va bien:

$ ps aux | grep gammu-smsd
gammu     6042  0.0  0.0  87776  2652 ?        Ss   18:12   0:00 /usr/bin/gammu-smsd --daemon --user gammu --pid /var/run/gammu-smsd.pid
1001      6069  0.0  0.0   7636   912 pts/4    R+   18:13   0:00 grep gammu-smsd

información relacionada