linux如何在javax之后释放串行端口。java/shell中的comm.portinUseeException
我有一个java应用程序,它从串行端口/dev/ttyUSB0
读取数据。该应用程序在Linux上运行,使用RXTX库从java访问串行端口
有时工作线程没有正确关闭串行端口,当启动一个新端口时,我得到javax.comm.PortInUseException
。
工作线程在调用close()
方法时卡住This has already been asked但我不能直接应用这种方法
有没有办法强制Linux关闭端口?我可以调用外部进程并以root用户身份运行shell脚本。一旦操作系统关闭端口,我打算在java中处理适当的异常
我无法重新启动机器
# 1 楼答案
首先,您应该调试代码,并确保负责关闭设备节点的线程确实关闭了它;因为您谈论的是对不可共享硬件设备的访问,所以在RXTX连接中使用Holder模式可能会有所帮助
如果程序没有正确地关闭设备节点,唯一的选择就是杀死它。您可以使用
fuser /dev/ttyUSB0
查看哪个进程打开了它,然后kill
查看该PID。这不需要root权限,只需要以拥有要终止的进程的用户的身份访问# 2 楼答案
几个月前,我在工作中确实遇到了这个问题(至少看起来很像)。我花了很多时间(大约一周)在上面。我查看了本机代码,发现了问题(在RXTX库中)
我将建议您实现与我相同的解决方案——正确管理线程和端口您不应该依赖PortinUseeException来检查端口是否已打开——这是针对“例外”情况的
只要确保你:
如果你更愿意解决这个问题,而不是用正确的方法来解决这个问题,那么问题就出在本机应用程序中,所以你需要找到一种方法来“重启”它。在我的例子中,它都在一个OSGi框架内,所以我可以卸载包含本机应用程序的捆绑包,然后再次安装它。在您的情况下,可能需要重新启动整个Java进程