Lsof

fuser vs lsof 檢查正在使用的文件

  • October 9, 2013

我收到了一些關於如何找出我的串口繁忙的建議。具體來說,當我嘗試啟動 gammu-smsd 時,它拒絕在 /dev/ttyS0 上啟動,因為它說埠很忙:

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

我使用了兩個不同的命令。他們倆都認為不同的過程是有罪的。首先我嘗試定影器:

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

所以 fuser 說 Dropbox 正在使用它。

然後我使用lsof:

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

lsof 說螢幕(而不是保管箱)正在使用它。

那麼這些程序中的哪一個(dropbox 或 screen)真的導致 gammu-smsd 因為資源“忙”而拒絕啟動?

簡短的回答是:screen.

稍長的答案是-m標誌fuser告訴它使用mountpoint列出所有內容。根據您的設置,這可能意味著全部/dev,但也可能是/. 顯然不是你想要的。如果你這樣做fuser -vm /dev/ttyS0,你會得到一個很長的列表,在我的系統上超過 60 行。

脫掉-m它,它可能會給你和你一樣的答案lsof

當我嘗試將 gammu-smsd 作為守護程序執行時,我的系統日誌(守護程序寫入的內容)表明 /dev/ttyS0 埠目前已打開並正在使用中。

所以為了弄清楚是什麼在使用它,我最初跑了

fuser -m -u /dev/ttyS0 

但是,該 -m 開關給出了欺騙性的響應,因為正如@derobert 所說,它列出了使用掛載點的所有內容。

lsof 命令正確報告了使用指定埠的程序:

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

現在我嘗試以乾淨的方式刪除 gnu 螢幕會話:

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

雖然退出了會話,但該過程仍然存在:

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

和:

    $ 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

所以我殺死了程序本身:

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

最後該過程終止。

現在我開始 gammu:

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

它執行良好:

$ 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

引用自:https://unix.stackexchange.com/questions/94316