Lsof
fuser vs lsof 檢查正在使用的文件
我收到了一些關於如何找出我的串口繁忙的建議。具體來說,當我嘗試啟動 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