fuser vs lsof zum Überprüfen der verwendeten Dateien

fuser vs lsof zum Überprüfen der verwendeten Dateien

Ich habe einige Vorschläge bekommen, wie ich herausfinden kann, warum mein serieller Port belegt ist. Insbesondere wenn ich versuche, gammu-smsd auf /dev/ttyS0 zu starten, weigert es sich, zu starten, weil es angibt, dass der Port belegt ist:

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

Ich habe zwei verschiedene Befehle verwendet. Beide finden unterschiedliche Prozesse verantwortlich. Zuerst versuche ich es mit fuser:

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

Also sagt Fuser, dass Dropbox es verwendet.

Dann verwende ich lsof:

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

lsof sagt, dass Screen (und nicht Dropbox) es verwendet.

Welches dieser Programme (Dropbox oder Bildschirm) führt also tatsächlich dazu, dass sich gammu-smsd nicht starten lässt, weil die Ressourcen „belegt“ sind?

Antwort1

Die kurze Antwort lautet: screen.

Die etwas längere Antwort ist, dass das -mFlag to fuseranweist, alles aufzulisten, indem esEinhängepunkt. Abhängig von Ihrer Konfiguration bedeutet das wahrscheinlich alle /dev, es könnte aber auch sein /. Das war eindeutig nicht das, was Sie beabsichtigt haben. Wenn Sie das tun, erhalten Sie eine sehr lange Liste fuser -vm /dev/ttyS0, über 60 Zeilen auf meinem System.

Nehmen Sie es ab -m, und Sie erhalten wahrscheinlich die gleiche Antwort wie lsofzuvor.

Antwort2

Als ich versuchte, gammu-smsd als Daemon auszuführen, zeigte mein Syslog (in das der Daemon schreibt) an, dass der Port /dev/ttyS0 derzeit geöffnet und in Verwendung sei.

Um herauszufinden, wer es benutzte, führte ich zunächst Folgendes aus:

fuser -m -u /dev/ttyS0 

Dieser Schalter -m gab jedoch eine irreführende Antwort, da er, wie @derobert sagte, alles auflistet, was den Einhängepunkt verwendet.

Es war der lsof-Befehl, der den Prozess über den angegebenen Port korrekt gemeldet hat:

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

Nun habe ich versucht, die GNU-Screen-Sitzung auf saubere Weise zu löschen:

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

Dadurch wurde die Sitzung beendet, der Prozess war jedoch noch aktiv:

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

Und:

     $ 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

Also habe ich den Prozess selbst beendet:

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

Und schließlich wurde der Prozess beendet.

Nun habe ich mit gammu angefangen:

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

Und es läuft einwandfrei:

$ 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

verwandte Informationen