我们在 Ubuntu 12.04 LTS 服务器上有一个Nagios
+设置,用于发送短信通知。我们使用的是通过 USB 电缆连接的旧诺基亚 6230 手机,但我不记得电缆的供应商符号。有时设备会变得无响应 - 显然设备地址从 变为或相反。check_mk
smstools
tty
/dev/ttyACM0
/dev/ttyACM1
根据smstools
日志:
2013-05-28 16:51:16,3, GSM1: Could not send character A, cause: Input/output error
2013-05-28 16:51:18,3, GSM1: Could not send character A, cause: Input/output error
事实上仅此而已(不过我还没有使用完整的调试模式)。
服务重启后smstools
是:
2013-05-28 22:29:09,3, GSM1: Cannot open serial port /dev/ttyACM0, error: No such file or directory
其中一些事件可能是由于我们的一位技术人员在连接其他设备时无意中断开手机几秒钟而引起的。但我不能确定。
问题是,如何让手机始终使用同一个tty
地址?我认为使用udev
规则是没有问题的,但我对此缺乏经验。
lsusb
手机的输出是:
Bus 002 Device 004: ID 0421:040f Nokia Mobile Phones 6230 GSM Phone
它是一个实时生产服务器,监控大约 250 个主机,目前我手头没有另一部手机进行实验,所以我自己无法通过反复试验来真正测试它。
编辑。
的输出udevadm info -q all -n /dev/ttyACM1 --attribute-walk
:
looking at device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.6/2-1.6:1.1/tty/ttyACM1':
KERNEL=="ttyACM1"
SUBSYSTEM=="tty"
DRIVER==""
looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.6/2-1.6:1.1':
KERNELS=="2-1.6:1.1"
SUBSYSTEMS=="usb"
DRIVERS=="cdc_acm"
ATTRS{bInterfaceNumber}=="01"
ATTRS{bAlternateSetting}==" 0"
ATTRS{bNumEndpoints}=="01"
ATTRS{bInterfaceClass}=="02"
ATTRS{bInterfaceSubClass}=="02"
ATTRS{bInterfaceProtocol}=="01"
ATTRS{supports_autosuspend}=="1"
ATTRS{bmCapabilities}=="6"
looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.6':
KERNELS=="2-1.6"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bNumInterfaces}=="11"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="e0"
ATTRS{bMaxPower}==" 8mA"
ATTRS{urbnum}=="391970"
ATTRS{idVendor}=="0421"
ATTRS{idProduct}=="040f"
ATTRS{bcdDevice}=="0550"
ATTRS{bDeviceClass}=="02"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{speed}=="12"
ATTRS{busnum}=="2"
ATTRS{devnum}=="4"
ATTRS{devpath}=="1.6"
ATTRS{version}==" 1.10"
ATTRS{maxchild}=="0"
ATTRS{quirks}=="0x0"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{authorized}=="1"
ATTRS{manufacturer}=="Nokia"
ATTRS{product}=="Nokia 6230"
looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1':
KERNELS=="2-1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="e0"
ATTRS{bMaxPower}==" 0mA"
ATTRS{urbnum}=="59"
ATTRS{idVendor}=="8087"
ATTRS{idProduct}=="0024"
ATTRS{bcdDevice}=="0000"
ATTRS{bDeviceClass}=="09"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="01"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{speed}=="480"
ATTRS{busnum}=="2"
ATTRS{devnum}=="2"
ATTRS{devpath}=="1"
ATTRS{version}==" 2.00"
ATTRS{maxchild}=="6"
ATTRS{quirks}=="0x0"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{authorized}=="1"
looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2':
KERNELS=="usb2"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="e0"
ATTRS{bMaxPower}==" 0mA"
ATTRS{urbnum}=="24"
ATTRS{idVendor}=="1d6b"
ATTRS{idProduct}=="0002"
ATTRS{bcdDevice}=="0302"
ATTRS{bDeviceClass}=="09"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{speed}=="480"
ATTRS{busnum}=="2"
ATTRS{devnum}=="1"
ATTRS{devpath}=="0"
ATTRS{version}==" 2.00"
ATTRS{maxchild}=="2"
ATTRS{quirks}=="0x0"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{authorized}=="1"
ATTRS{manufacturer}=="Linux 3.2.0-38-generic ehci_hcd"
ATTRS{product}=="EHCI Host Controller"
ATTRS{serial}=="0000:00:1d.0"
ATTRS{authorized_default}=="1"
looking at parent device '/devices/pci0000:00/0000:00:1d.0':
KERNELS=="0000:00:1d.0"
SUBSYSTEMS=="pci"
DRIVERS=="ehci_hcd"
ATTRS{vendor}=="0x8086"
ATTRS{device}=="0x1e26"
ATTRS{subsystem_vendor}=="0x1043"
ATTRS{subsystem_device}=="0x84ca"
ATTRS{class}=="0x0c0320"
ATTRS{irq}=="23"
ATTRS{local_cpus}=="00000000,00000000,00000000,00000000,00000000,00000000,00000000,0000000f"
ATTRS{local_cpulist}=="0-3"
ATTRS{numa_node}=="-1"
ATTRS{dma_mask_bits}=="32"
ATTRS{consistent_dma_mask_bits}=="32"
ATTRS{enable}=="1"
ATTRS{broken_parity_status}=="0"
ATTRS{msi_bus}==""
ATTRS{companion}==""
ATTRS{uframe_periodic_max}=="100"
looking at parent device '/devices/pci0000:00':
KERNELS=="pci0000:00"
SUBSYSTEMS==""
DRIVERS==""
我不确定要使用哪个父树级别的哪些属性。
我尝试了 withSUBSYSTEM=="usb",ATTRS{product}=="Nokia 6320",NAME="ttyACM*",SYMLINK+="nokia"
和变体(SYMLINK
- without +
; KERNEL=="2-1.6"
, withoutNAME
等等),全部在/etc/udev/rules.d/10-local.rules
文件中。我只是没有得到任何符号链接或根本没有明显的变化。
也许问题在于规则的应用方式- 我无力重新启动机器,我希望我不必派技术人员到服务器机房只为了插入和拔出 USB 电缆。我使用了/etc/init.d/udev restart
,udevadm control --reload-rules
和以及,等的udevadm trigger
一些组合,如中所述--attr-match=vendor="Nokia"
--attr-match=product="Nokia 6320"
这个答案。我应该派技术人员来插拔设备还是购买另一部(便宜的)手机进行测试?
答案1
我可以确认,如果没有设备名称,smstools 根本不会启动。所以这行不通:
设备 = GSM*
#设备= /dev/ttyACM0
您可以添加两个设备,但这也不是正确的解决方案。当 smstools 使用 ACM1 和 ACM0 时,会发生什么?是的,您的手机无法用于通话/短信。
我还没有找到正确的解决方案,但上面的方法根本行不通。实际上是从这个网站复制的:http://unix.findincity.net/view/635395087004115229136640/point-usb-phone-to-specific-devttyacm-using-udev
答案2
想法#1:监控和重启
我认为这是一种黑客攻击,但您可以设置一个 cron 来监视 smstools 日志,以了解何时发生这种情况,并在此时恰好位于的任何设备上重新启动 smstools。
您可以使用此 nagios 脚本查看 smstools 日志,检查日志3.pl:
check_log3.pl -l /var/log/smstools -s /tmp/log_smstools.seek \
-p 'Input/output error'
一旦检测到错误,您可以重新启动 smstools。为了解决移动问题,您可以保留 smstool 的配置文件的 2 个副本,一个用于设置 /dev/ttyACM0
,另一个用于/dev/ttyACM1
.
使用合适的启动。
想法#2:添加两个设备
查看文档短信工具看来您可以将两个 tty 添加到文件中或完全不指定设备行。
devices = GSM*
# device = /dev/ttyACM0