Script Bash: Controlar ancho de banda de Transmission automáticamente

Hola a todos. Este es mi segundo post. No suelo escribir posts a menos que tenga algo bueno para compartir y esta vez tengo algo que seguramente a muchos les va a interesar.

Hace unos meses pensaba hacer un script para limitar el ancho de banda de aplicaciones, pero tenía algunos problemas y errores que me dificultaban la tarea, entonces plantee mis dudas en el foro de <º DesdeLinux por si a alguien se le ocurría una idea.

Así lo dejé por un tiempo y un buen día me propuse retomar el script. Hice muchas pruebas, leí bastante sobre bash, y tuve dolores de cabeza en mis ratos libres  ¡¡Pero lo logre!!

Tengo una satisfacción enorme y entonces he decidido compartir con ustedes mi pequeño script para que lo usen y mejoren. Pienso licenciarlo bajo GPLv3, pero es mi primer proyecto así que no estoy muy seguro cómo se hace ésto (necesito consejos de quien lo haya hecho antes).

Bien, ahora explicaré cuál era mi necesidad y qué hice para solucionar el problema.

Situación
Tengo un plan de Internet de 512Kbs, por lo tanto hago uso de Transmission como cliente BitTorrent para descargar archivos grandes (como LibreOffice y algunas distros de GNU/Linux). Con esa velocidad las descargas demoran bastante y el problema es al usar el navegador web Firefox: tarda bestante en cargar.

Cuando me conecto a Internet, activo los límites temporales de carga y descarga de Transmission y espero a que cargue Firefox, luego arranco nuevamente los torrents. Como verán, hacer esto un par de veces es tedioso. Ni hablar de que a veces directamente pauso todos los torrents y luego me olvido de activarlos de nuevo, lo que lleva a tiempo valioso perdido para la carga/descarga de los torrents.

Solución
Para este problema decidí crear un script en Bash que hace básicamente lo siguiente:

1. Comprueba que Transmission esté ejecutándose y no haya ningún torrent pausado. De ser así, activa nuevamente los torrents.

2. Verifica que Firefox esté en ejecución. Luego obtiene los KB/s enviados y recibidos por él y los guarda en un archivo.

3. Si los KB/s de carga o descarga del navegador superan un margen de referencia, se cambian los valores de subida/bajada de Transmission.

Esto permite que al querer acceder a una página web, cuando el navegador envía la petición, se limite la carga de archivos de Transmission y cuando se reciben los datos de la página, se limita la descarga. Esto funciona muy bien cuando se acceden a varias páginas a la vez y realmente los resultados son los mismos que con Transmission desactivado.

La gran ventaja es que es totalmente automático y no requiere de mi intervención.

El script
Si bien podría usarse para controlar el consumo de ancho de banda de cualquier aplicación, por el momento sólo está escrito para solucionar un problema muy particular. Pero no es muy difícil hacer modificaciones.

Requisitos
Para que funcione correctamente es necesario tener instalada la aplicación «nethogs».

En este caso como el script funciona con Firefox y Transmission, es necesario tener estas aplicaciones instaladas, además de «transmission-remote» que es la que cambia los valores de carga y descarga de los torrents. También uso en el script «awk». Lo menciono porque no sé si todas las distros lo traen instalado.

Software utilizado
Una lista de las aplicaciones que hace uso el script y el sistema donde funciona.

•Debian GNU/Linux 6.0.8
•Linux 2.6.32-5-686
•Firefox 24.0
•Transmission 2.03 (11030)
•Nethogs 0.7.0

Ejecución
Debe ejecutarse como root debido a que nethogs solo puede ejecutarse con ese usuario, pero transmission-remote se ejecuta con el usuario normal por medio del comando su.

El script usa el comando interno de Bash trap con el cual permite restaurar los valores predeterminados de carga/descarga de Transmission, cuando es detenido mediante las señales SIGINT (CTRL+c) o SIGTERM.

Aún no se bien cómo hacer para ejecutarlo al inicio y que se detenga cuando apago o reinicio el equipo. Pensaba colocar un enlace en el archivo /etc/rc.local pero no se si funcionaría, y no entiendo muy bien cómo funciona /etc/init.d (ví algunos scripts que allí se encuentran, incluso skeleton, pero no los entiendo). Si alguien puede ayudarme, le estaré muy agradecido.

 

Bueno amigos, eso es todo. Espero que mi pequeño aporte les resulte útil y que puedan mejorarlo si así lo desean. Con gusto leeré sus opiniones y recomendaciones como así también sugerencias en caso de que haya problemas de seguridad con el archivo (no soy programador, sólo hago algunas cosas de vez en cuando).

Se que con algunos arreglos puede llegar a ser una gran aplicación en el futuro, pues no conozco algún programa que haga lo mismo. Por ejemplo se me ocurre que podría tener una interfaz gráfica en zenity y poder elegir las aplicaciones a las que queremos priorizar en el uso de ancho de banda (navegador web, gestor de actualizaciones, transferencia de archivos, etc.) y los distintos valores de referencia. Sí, es algo ambicioso, pero bastante útil.

Pueden descargar el script en el paste. ¡¡Muchas gracias por leer!!


23 comentarios

  1.   elav dijo

    Oh! Interesante 😀

    1.    eliotime3000 dijo

      En la esquina inferior izquierda tienes la opción de limitar el ancho de banda que consume Transmission tanto en la subida como en la bajada. Con Transmission no he tenido problema alguno con ello.

      1.    cookie dijo

        Pero esto es automático, además también hay Transmission sin interfaz gráfica así que puede no tenga esa función tan a la mano.

      2.    Joaquin dijo

        Hola, cómo estás.
        Sí eso ya lo sé. Pero es justamente lo que no quiero hacer.
        Tengo un plan de Internet muy pobre (512KB y es lo mejor en mi zona).

        Con mi script, me despreocupo de hacer todo a mano. Imaginate que abrís una página en el navegador y Transmission está ocupando todo el ancho de banda en ese momento, entonces la página tarda un rato en cargar (a lo sumo 1′, pero es desesperante). Ya me cansé de “activar los límites temporales” cada dos minutos. Esto es automático y casi instantáneo (verifica los KB enviados y recibidos por Firefox cada 5 segundos).

        Realmente en mi caso con esa velocidad de Internet, es excelente. Además no conozco otra aplicación que haga esto, sino no lo hubiera hecho. Las que he visto sólo limitan el ancho de banda, pero no automáticamente.

        Espero haber sido claro. Gracias por leer!

        1.    Joaquin dijo

          Perdón, me expresé mal. No son 512KB , más bien son Kbits. (O sea, 1/2 “Mega”). Lo máximo que puedo descargar es a 75KB/s y de subida 50KB/s. Eso cuando anda bien Internet, sino lo normal es 48 y 23.

    2.    Joaquin dijo

      Gracias!

  2.   cookie dijo

    Interesante, yo uso qBittorrent y uso el switch para los límites.

    Se ve bonito el post con esos colores 😉

    1.    Joaquin dijo

      Gracias por lo de los colores. No soy muy bueno en eso, parece muy largo y monótono con tanto texto.

  3.   jorge dijo

    En lo personal uso transmission-daemon y firefox con pestaña de aplicacion viva, asi no ando con programas externos u olvidandome de continuar los torrents o la tortuga activada (y puedo controlarlo desde mi telefono). Para iniciar un servicio se agrega un usuario (ej:adduser –disabled-password nethogs), se crea un archivo de texto para el demonio en /etc/init.d con un nombre (ej:nethogs-daemon) y luego en debian se escribe “update-rc.d nethogs-daemon defaults” para que arranque solo.

    El archivo de texto es un script bash tambien, que puedes fusionar tu script dentro.
    Fijate si te puede servir esto, sirve para autoarrancar transmission-daemon, puede servir para autoarrancar nethogs https://trac.transmissionbt.com/wiki/Scripts/initd

    1.    Joaquin dijo

      Hola!
      A ver si entendí: esto es para arrancar Transmission al inicio y detenerlo al apagar o reiniciar. Con eso no tengo problemas ya que siempre arranca solo y comienza a descargar (Lo agregué a las aplicaciones al inicio en Xfce).

      Mi problema es que si al colocar el script en rc.local o en init.d yo no sé cómo el equipo detiene el script. O sea, obviamente al apagar/reiniciar la PC, se terminan todos los procesos (y con ellos también Transmission y Nethogs) pero no sé que pasaría con mi script.

      ¿Y por qué me preocupa eso? El script crea un archivo en /tmp y controla la velocidad de Transmission. Si yo lo ejecuto en una terminal y de repente lo detengo (por ejemplo con CTRL + c), el script antes de cerrarse, restaura las velocidades por defecto (en caso de que sea necesario) y luego detiene Nethogs y borra el archivo de /tmp. Traté de hacerlo lo más “profesional” posible para que no deje ningún archivo suelto o proceso en segundo plano.

      Sobre lo que dijiste, no entendí qué es «pestaña de aplicacion viva».

      1.    jorge dijo

        Una pestaña de aplicacion es una pestaña permanente, siempre esta abierta y minimizada dentro de firefox http://i.imgur.com/a5i0aP3.png (menu contextual sobre pestaña, clic en “pegar pestaña”). Los daemon al enviar señal TERM esperan un rato, hasta despues de haber cerrado sesión, y guardan sus datos. Fijate que en el enlace que di antes al salir el script llama a start-stop-daemon y le dice a transmission que detenga, ahi podrias pegar “killall nethogs” y lo que contiene DetenerScript. El script en init en este caso tendrias que llamarlo como root en vez de un usuario especifico, ya que necesita privilegios.

        1.    Joaquin dijo

          Bueno gracias por el dato. En cuanto tenga tiempo lo pruebo!

  4.   facundo dijo

    genial, me he encontrado con este inconveniente ya que aunque se tenga una conexión rápida uno se ve obligado a limitar transmission mientras quiere navegar y así “desperdicia” tiempo.
    Lo voy a probar cuando pueda. Saludos y gracias!!

    1.    Joaquin dijo

      Gracias a vos! Espero que te sirva!

      1.    Facundo dijo

        Hola de nuevo Joaquin. Veo que estas ocupandote de responder a todos los comentarios asique me voy a aprovechar de eso y te voy a hacer un par de consultas de novato.
        Primero ¿cómo se si tengo el script “awk” instalado? Uso Debian 7.2.
        Segundo, no se bien qué hacer con el código del paste. Tengo que agarrar un editor de texto y guardarlo en un archivo que se llame “controla-ancho-de-banda.sh” y después ejecutarlo como “./controla-ancho-de-banda.sh”. Esta es la parte en la que estoy más perdido.
        Tercero: Cuando decís ejecutarlo como root, es necesario cambiar de usuario a root o con un sudo alcanza?

        Si tenes alguna lectura para recomendarme del tema, te lo agradezco.
        Saludos!

  5.   Giskard dijo

    Por eso siempre desinstalo Transmission e instalo Deluge. Bueno, por eso y un pocotón de cosas más que me ofrece Deluge que el otro no trae.

    1.    Joaquin dijo

      Hola, no conozco Deluge. Mi problema principal es el servicio de Internet. Con esto lo exprimo al máximo.

  6.   panda dijo

    hola. mi ancho de banda también es limitado así k probé este script. pero no me funciona. el error parece ser en el comando nethogs -t. devuelve el error “Waiting for first packet to arrive (see sourceforge.net bug 1019381)” ya intente en mint, en archlinux y nada. que se supone k debería devolver ese comando? supongo k deveria imprimir en texto plano el ancho de banda usado x cada aplicación. conoces otra programa k permita escuchar la red??

    1.    Joaquin dijo

      Hola, cómo estás.
      Ese es un error de Nethogs. A mí también me aparece, pero funciona de todas maneras.

      Lo que hace Nethogs es mostrar los procesos que más ancho de banda consumen, en tiempo real. En el script, se guarda su salida en un archivo de texto «net.lista», para poder filtrarlo después.

      El script sólo funciona con Transmission (un cliente BitTorrent) y Firefox (navegador web). Lo que hace es limitar el ancho de banda de Transmission cuando Firefox está cargando alguna página Web. Necesitas instalar: Nethogs, Transmission, Transmission-remote y Firefox.

      Está todo explicado en el post, así que no sé cuál es tu problema.

      PD: Por favor escribe correctamente y mejora tu ortografía. Es un comentario, no un mensaje de texo.

      1.    panda dijo

        el script no funciona para mi. imprime muchas veces ese mensaje de error. ejecute “nethogs -t” en una terminal para ver que es lo que hace pero no imprime nada, solo el error. en mi pc no esta funcionando. yo imaguino que deberia imprimir algo similar a lo que imprime al ejecutarlo sin el -t, mostrando los procesos y el ancho de banda. pero en mi caso no imprime nada de eso. cual distro usaste para desarrollar el script?

        1.    Joaquin dijo

          Si te fijas bien, en el post está todo el software utilizado y sus versiones. El error no sé por qué, pero a mí también me aparece cada vez que se ejecuta «nethogs -t». En el script va a suceder cada 2″.

          Puede ser que en momento que ejecutas nethogs, no haya ningún proceso utilizando la red y por eso no obtienes salida alguna.

          El script debe ejecutarse como root porque nethogs necesita de ese usuario para funcionar.

          ahora me acordé de algo importante y sé por qué no te funciona:

          DEBES EDITAR el script y cambiar el nombre del usuario normal. En el script se llama «joaquin». Debes cambiarlo por el nombre de tu usuario.

          Perdón no me habiá dado cuenta de eso, tendría que haber puesto el nombre en una variable. Lo que pasa es que no pensé en hacerlo tan general, sólo quería mostrárselos para que lo vieran y quienes quieran puedan sacar ideas de cómo hacerlo. No lo hice con la intención de que funcionara en cualquier equipo, eso lleva tiempo y yo no sé programar, algunas cosas se me pasan.

          Que tengas suerte, cualquier cosa pregunta de nuevo. Y por favor lee de nuevo el post y los comentarios del script.

  7.   Facundo dijo

    Hola Joaquín, me dice lo siguiente:

    transmission-remote: (http://localhost:9091/transmission/rpc/) Couldn’t connect to server
    ioctl failed while establishing local IP for selected device eth0. You may specify the device on the command line.

    alguna idea?? gracias!

    1.    Joaquin dijo

      Hola, cómo estás.
      Disculpame pero no tengo ni la menor idea 😀
      Por lo que entiendo que dice el error, es un problema con ioctl, pero no sé qué es eso.

      Tal vez podrías probar detener el script y ver si funciona transmission-remote con algunas de sus opciones (lee su página de manual con el comando «man»).

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.