Столкнулся с такой проблемой, решения в интернете не нашел. В чате нашел такую же проблему, но человеку так и не ответили. Нашел свое решение (храни вас ИИ), делюсь:
- Ищем остался ли lock файл после выдёргивания питания:
find /etc/qbittorrent -maxdepth 3
Тут он есть:
/etc/qbittorrent/qBittorrent/config:
drwxr-xr-x 3 root root 680 Aug 13 11:22 .
drwxr-xr-x 5 root root 352 Aug 13 10:20 ..
-rw-r–r-- 1 root root 4 Aug 13 10:20 categories.json
srwx------ 1 root root 0 Aug 13 11:22 ipc-socket
-rw-r–r-- 1 root root 101 Aug 13 11:22 lockfile
В чем была проблема:
Это классический lock-файл (файл блокировки). Когда qBittorrent запускается, он создает этот файл, чтобы защитить профиль от одновременного запуска двух копий.
Когда ты выдернул шнур питания, роутер выключился мгновенно, и программа просто физически не успела стереть этот файл при завершении работы. При следующем включении служба qBittorrent пытается стартовать, видит этот lockfile и думает: “Внимание! Копия программы уже заведена и работает!”, после чего падает с ошибкой. procd пытается её перезапустить — получается тот самый crash loop.
А когда ты запускал его вручную (qbittorrent-nox), он создавал конфиг в другом месте, где этого файла не было, поэтому он и открывался.
Лечение:
-
Проверка что в этом проблема:
/etc/init.d/qbittorrent stop
rm -f /etc/qbittorrent/qBittorrent/config/lockfile
/etc/init.d/qbittorrent start -
Если в этом - автоматизируем удаление
автоматическая очистка при старте службы — это самое изящное и правильное решение для роутера. В среде embedded-систем (как OpenWrt) это стандартная практика: скрипт инициализации должен сам готовить себе “чистое” окружение (pre-flight check) перед запуском программы. Это делает систему “пуленепробиваемой” к выдергиванию шнура.
Мы просто добавим команду удаления этого файла в начало функции start_service() в скрипте /etc/init.d/qbittorrent.
Как это сделать одной командой:
Эта команда найдет строку начала функции start_service() и вставит туда команду удаления lockfile. Выполни это в терминале:
Bash
sed -i '/start_service() {/a \\trm -f /etc/qbittorrent/qBittorrent/config/lockfile' /etc/init.d/qbittorrent
*(Что делает эта команда: она ищет функцию start_service и вставляет сразу после нее команду удаления файла блокировки с нужным отступом).
Проверим, что получилось:
Давай взглянем на измененный скрипт:
Bash
cat /etc/init.d/qbittorrent
Ты должен увидеть что-то вроде этого в начале функции start_service:
Bash
start_service() {
rm -f /etc/qbittorrent/qBittorrent/config/lockfile
config_load qbittorrent
...
ИТОГ:
- Обычный ребут через команду - всё ОК
- Выдёргивание питания на 5минут - всё ОК