alexdelorenzo / cast_control

📺 Control Chromecasts from Linux and D-Bus

Home Page:https://alexdelorenzo.dev

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Occasional crash

yochananmarqos opened this issue · comments

I use the following script on system startup:

#!/bin/bash

export SECONDS=60
cast_control service connect --name "Marks_TV" --icon --wait $SECONDS &

Occasionally I notice cast_control is no longer running and find this in the log:

~/.cache/cast_control/log/cast_control.log:

ERROR:daemons.startstop.simple:Uncaught exception in the daemon run() method.
Traceback (most recent call last):
  File "/usr/lib/python3.9/site-packages/daemons/startstop/simple.py", line 48, in start
    self.run()
  File "/usr/lib/python3.9/site-packages/cast_control/daemon.py", line 71, in run
    self.target()
  File "/usr/lib/python3.9/site-packages/cast_control/run.py", line 93, in run_safe
    run_server(*args)
  File "/usr/lib/python3.9/site-packages/cast_control/run.py", line 77, in run_server
    mpris = retry_until_found(name, host, uuid, wait, retry_wait)
  File "/usr/lib/python3.9/site-packages/cast_control/run.py", line 54, in retry_until_found
    mpris = create_adapters_and_server(name, host, uuid, retry_wait)
  File "/usr/lib/python3.9/site-packages/cast_control/run.py", line 26, in create_adapters_and_server
    device = find_device(name, host, uuid, retry_wait)
  File "/usr/lib/python3.9/site-packages/cast_control/base.py", line 208, in find_device
    device = get_device(name, retry_wait)
  File "/usr/lib/python3.9/site-packages/cast_control/base.py", line 171, in get_device
    devices, service_browser = get_chromecasts(retry_wait=retry_wait)
  File "/usr/lib/python3.9/site-packages/pychromecast/__init__.py", line 225, in get_chromecasts
    get_chromecast_from_cast_info(
  File "/usr/lib/python3.9/site-packages/pychromecast/__init__.py", line 86, in get_chromecast_from_cast_info
    return Chromecast(
  File "/usr/lib/python3.9/site-packages/pychromecast/__init__.py", line 337, in __init__
    self.socket_client = socket_client.SocketClient(
  File "/usr/lib/python3.9/site-packages/pychromecast/socket_client.py", line 201, in __init__
    self.socketpair = socket.socketpair()
  File "/usr/lib/python3.9/socket.py", line 606, in socketpair
    a, b = _socket.socketpair(family, type, proto)
OSError: [Errno 24] Too many open files

Thanks opening an issue and including logs with it. Also, thanks for packaging this project on the AUR!

Can you post the output of the following commands?

#!/usr/bin/env bash

echo $(python3 --version)
echo $(cast_control --version)
python3 -m pip show cast_control mpris_server PyChromecast

In your launch script, if you add --log-level debug, it will log more information that can make this easier to debug, as well.

It looks like the daemon is hitting your system's limit for per-process open file descriptors. I'm guessing that pychromecast.get_chromecasts() results in opening socket fds that aren't closed and the loop in cast_control.run.retry_until_found() causes it to open new socket fds until the limit is hit. I'll try to test and see if this is the issue.

Do you turn off your Chromecast or sometimes use your computer on networks that you can't access your Chromecast from?

As an aside, if you use the service connect command, you shouldn't need to use the & Bash feature to run cast_control in the background, as it will daemonize itself.

Python 3.9.5
cast_control v0.10.11
Name: cast-control
Version: 0.10.11
Summary: 📺 Control Chromecasts from Linux and D-Bus
Home-page: https://github.com/alexdelorenzo/cast_control
Author: Alex DeLorenzo <alex@alexdelorenzo.dev>
Author-email: None
License: AGPL-3.0
Location: /usr/lib/python3.9/site-packages
Requires: appdirs, click, daemons, PyChromecast, pydbus, PyGObject, aiopath, mpris-server, typing-extensions
Required-by: 
---
Name: mpris-server
Version: 0.2.18
Summary: Publish a MediaPlayer2 MPRIS device to D-Bus.
Home-page: https://alexdelorenzo.dev
Author: Alex DeLorenzo
Author-email: None
License: AGPL-3.0
Location: /usr/lib/python3.9/site-packages
Requires: PyGObject, pydbus, unidecode, emoji
Required-by: cast-control
---
Name: PyChromecast
Version: 9.2.0
Summary: Python module to talk to Google Chromecast.
Home-page: https://github.com/balloob/pychromecast
Author: Paulus Schoutsen
Author-email: paulus@paulusschoutsen.nl
License: MIT
Location: /usr/lib/python3.9/site-packages
Requires: protobuf, zeroconf, casttube
Required-by: cast-control

My Chromecast is always plugged in, but the TV is off most of the day. My laptop is always on and on the same Wi-Fi network.

Thanks @yochananmarqos. I pushed some changes to PyPI that address a cause for the app hitting the open socket descriptor limit.

You can try the changes out by upgrading cast_control and mpris_server:

$ python3 -m pip install cast_control==0.11.3
$ python3 -m pip install mpris_server==0.3.4

I haven't reproduced the bug myself because I need to run cast_control longer in order to hit the open fd limit, but I'm pretty confident that the issue was addressed with 033536e, at least partially if not fully.

I'll let you know if it happens again.

I'm going to close this issue. Feel free to open a new issue if you run into this issue again.