LINUX.ORG.RU
ФорумAdmin

OSError: [Errno 24] Too many open files

 , , ,


0

2

Всем привет!

У меня есть проблема в работе с моей Raspberry pi 4.

Скрипт на базе Python 3.7 + OpenCV3 падает раз в два дня.

В консоли выдается следующая ошибка:

Traceback (most recent call last): 
  File "people_counter.py", line 146, in <module> 
  File "people_counter.py", line 19, in send_osc 
  File "/home/pi/.virtualenvs/py3cv3/lib/python3.7/site-packages/osc4py3/as_eventloop.py", line 149, in osc_udp_client 
  File "/home/pi/.virtualenvs/py3cv3/lib/python3.7/site-packages/osc4py3/as_eventloop.py", line 230, in _select_monitor 
  File "/home/pi/.virtualenvs/py3cv3/lib/python3.7/site-packages/osc4py3/oscscheduling.py", line 167, in create_platform_socket_monitor 
  File "/home/pi/.virtualenvs/py3cv3/lib/python3.7/site-packages/osc4py3/oscscheduling.py", line 681, in init 
  File "/home/pi/.virtualenvs/py3cv3/lib/python3.7/site-packages/osc4py3/oscscheduling.py", line 612, in init 
  File "/home/pi/.virtualenvs/py3cv3/lib/python3.7/site-packages/osc4py3/oscscheduling.py", line 637, in create_monitor_sockets 
  File "/usr/lib/python3.7/socket.py", line 151, in init 
OSError: [Errno 24] Too many open files

Попробовал поднять лимиты:

ulimit -a

ulimit -a выдает такие конфиги:
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 28771
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 500000
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 95
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 28771
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited


Последнее исправление: zudva (всего исправлений: 1)

Если скрипт через systemd запускается, у него свои настройки ограничений в /etc/systemd/system.conf.

Atragor
()

Стоит поискать, где дескрипторы утекают. Открываешь файлы, но забываешь закрывать?

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

[quote]Стоит поискать, где дескрипторы утекают.[/quote]

А как провести анализ?

[quote]Открываешь файлы, но забываешь закрывать?[/quote]

Мне нужно что бы скрипт работал максимально долго. Он сам падает с ошибкой.

Или я не верно понял вопрос?

zudva
() автор топика
Ответ на: комментарий от zudva

А как провести анализ?

Самое надёжное — просмотреть скрипт глазами и убедиться, что ненужные открытые дескрипторы не висят до окончания программы. В /proc/«идентификатор-процесса»/fd есть симлинки всех открытых процессом файлов. Туда стоит посмотреть во время работы. Там не должно быть лишнего.

i-rinat ★★★★★
()
Ответ на: комментарий от Atragor

Нет, я запускаю скрипт через bash.

Командой: source v.sh

#!/usr/bin/sh
echo "Запуск вертикального режима" 
source /home/pi/.profile
sleep 2
workon py3cv3
#cd /home/pi/Documents/people_counter/
python /home/pi/Documents/people_counter/people_counter.py -m vertical -s 30
zudva
() автор топика
Ответ на: комментарий от zudva

Или я не верно понял вопрос?

неверно понял. каждый файл, который ты открываешь, нужно закрывать, когда заканчиваешь работать с ним. в питоне крайне желательно для этого использовать менеджер контекста (with)

eternal_sorrow ★★★★★
()
Ответ на: комментарий от eternal_sorrow

Спасибо за направление мысли!

Вопрос: у меня вроде как нет записи и инициализирован цикл while который производит просчет фреймов из входящего rtsp потока.

Скрипт работает на основе кода Adrian Rosebrock, его статья: https://www.pyimagesearch.com/2018/08/13/opencv-people-counter/

Плагин OSC ( osc4py3 ): https://pypi.org/project/osc4py3/

Тут может иметь место быть работа OSC с дескрипторами файлов?

zudva
() автор топика
Ответ на: комментарий от zudva

входящего rtsp потока

ну как минимум сам поток является файлом. если ты открываешь его много тысяч раз и не закрываешь ни разу, дескрипторы закончатся однажды

eternal_sorrow ★★★★★
()
Ответ на: комментарий от eternal_sorrow

Обдумал.

Я брал код из примера к osc4py3:

def send_osc(digits):

	osc_startup()
	osc_udp_client("192.168.x.x", 8001, "OSC Сhannel")

	msg = oscbuildparse.OSCMessage("/count", None, [digits])
	osc_send(msg, "OSC Сhannel")

	osc_process()
	osc_terminate()

Насколько я понимаю: osc_process() и osc_terminate() - по сути должны завершать процесс и освобождать дескрипторы? Вообще, насколько это вяжется с задачей отчета от 0 до 1000, например?

zudva
() автор топика
Ответ на: комментарий от eternal_sorrow

Спасибо!

Проблема была с дескрипторами, все исправил. Спасибо!

zudva
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.