![fusion 与 lsof 检查正在使用的文件](https://linux22.com/image/51342/fusion%20%E4%B8%8E%20lsof%20%E6%A3%80%E6%9F%A5%E6%AD%A3%E5%9C%A8%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%87%E4%BB%B6.png)
我收到了一些关于如何找出串行端口繁忙原因的建议。具体来说,当我尝试启动 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
所以 fusioner 说 dropbox 正在使用它。
然后我使用 lsof:
sudo lsof | grep ttyS0
screen 23520 root 6u CHR 4,64 0t0 1421 /dev/ttyS0
lsof 表示 screen(而不是 dropbox)正在使用它。
那么,这些程序(dropbox 或 screen)中的哪一个真正导致 gammu-smsd 由于资源“繁忙”而拒绝启动?
答案1
简短的答案是:screen
。
稍微长一点的答案是,-m
告诉fuser
它使用以下命令列出所有内容的标志挂载点。根据您的设置,这可能意味着全部/dev
,但也可能是/
。显然不是您想要的。如果您这样做,您将获得一个非常长的列表fuser -vm /dev/ttyS0
,在我的系统上超过 60 行。
去掉它-m
,它可能会给你同样的答案lsof
。
答案2
当我尝试将 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 会话:
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