Вопрос или проблема
Я использую RXTXcomm.jar и librxtxSerial.so из пакета librxtx-java на 64-битной Ubuntu 18.04 LTS и получаю следующее предупреждение каждый раз, когда запускаю свое приложение на 64-битной JRE версии 1.6.0_45:
RXTX Warning: Removing stale lock file. /var/lock/LCK..ttyACM0
Есть ли способ избавиться от этого надоедливого предупреждения RXTX?
Вы можете просто добавить “sudo” перед выполнением вашего java-приложения.
sudo java -jar xxxxx.jar
Так как для удаления файла блокировки могут потребоваться права “администратора”.
Или вы можете удалить файл блокировки вручную перед запуском JAVA-программы.
sudo rm -f /var/lock/<имя файла блокировки>
Это может случиться, если ваша программа ранее завершала работу, не закрыв этот последовательный порт. Если этот порт используется на протяжении всего выполнения программы, и вы не беспокоитесь о зависших портах во время работы программы, его можно закрыть с помощью Runtime.getRuntime().addShutdownHook(…). Поскольку текущая конвенция — использовать Cleaners вместо finalize(), вызов port.cleanable.clean() из этого хука может быть разумным выбором при проектировании.
Мне удалось исправить эту проблему с помощью вышеуказанного проектного решения без предоставления программе прав SUDO.
Ответ или решение
Для решения проблемы с "RXTX Warning: Removing stale lock file. /var/lock/LCK..ttyACM0" при использовании библиотеки RXTXcomm.jar и файла librxtxSerial.so под 64-битной версией Ubuntu 18.04 LTS совместно с Java SE 1.6.0_45, необходимо устранить причины возникновения этого предупреждения.
Введение в проблему
Когда вы видите предупреждение о "stale lock file", это означает, что предыдущий запуск вашего приложения не закрыл последовательно используемый порт корректно. В результате чего в системе остаётся заблокированный файл в каталоге /var/lock/
, который пытается удалить RXTX.
Причины и решение
-
Необработанные завершения программы
Программа может завершаться аварийно без корректного закрытия порта. Чтобы этого избежать, добавьте в код обработку закрытия порта в блокеfinally
или используйтеShutdownHook
. -
Реализация
ShutdownHook
для корректного закрытия порта- Используйте
Runtime.getRuntime().addShutdownHook(...)
, чтобы гарантировать закрытие порта, даже если программа завершается неожиданно. - Вместо устаревшего метода
finalize()
предпочтительнее использоватьCleaner
.
- Используйте
-
Ручное удаление файлов блокировок
- Если вы доверяете своему коду, но хотите временно избавиться от предупреждения, можно вручную удалить файл блокировки перед запуском программы.
sudo rm -f /var/lock/LCK..ttyACM0
- Если вы доверяете своему коду, но хотите временно избавиться от предупреждения, можно вручную удалить файл блокировки перед запуском программы.
-
Запуск приложения от имени администратора
- Выполнение программы с правами суперпользователя позволит автоматически удалять эти файлы, но этот способ не рекомендуется из соображений безопасности.
sudo java -jar yourapplication.jar
- Выполнение программы с правами суперпользователя позволит автоматически удалять эти файлы, но этот способ не рекомендуется из соображений безопасности.
Пошаговый план устранения
- Шаг 1: Проверьте и измените код программы, добавив механизмы обработки закрытия порта. Это важно для предоставления устойчивого решения.
- Шаг 2: Изучите документацию RXTX на предмет рекомендаций по безопасному управлению последовательными портами.
- Шаг 3: Ручная или автоматическая проверка и удаление блокировочных файлов в тестировании или деплое.
Заключение
Проактивное управление ресурсами системы и тщательное проектирование вашего приложения избавят вас от появления предупреждений о "stale lock files". Это не только повысит стабильность приложения, но и приведет к лучшей практической эксплуатации последовательных портов.
Такой подход обеспечит профессиональное и стабильное функционирование вашего приложения в любой среде.