Publi

Pausar aplicaciones haciendo click en la ventana correspondiente

Todo empezó un caluroso día del mes pasado. Cuando, estando trabajando, utilizando Firefox como navegador encuentro información interesante acerca de mi actual proyecto. Aunque no era el único programa en ejecución, el hecho es que tenía toda la RAM llena, y unas 20 ventanas abiertas. De repente, recibo una llamada de teléfono y tengo que ponerme inmediatamente con otra cosa. La página que tengo en mi navegador, es muy pesada, y el ordenador empieza a ir un poco lento, además, el ventilador de la CPU se pone en marcha, muy rápido y de manera muy ruidosa, haciendo que, hasta mi interlocutor se da cuenta de ello.

Mientras me cuentan mi nueva tarea, el ordenador no iba muy fluido y necesitaba consultar lo que me estaban relatando en la llamada telefónica.

De repente, vienen a mi cabeza las señales de los procesos y se me ocurre ejecutar un simple compando.

$ killall -SIGSTOP firefox

El uso de CPU baja a un nivel más o menos aceptable, dejándome abrir otro navegador para consultar la nueva información.

La historia anterior puede repetirse con muchas variaciones, pero el hecho es que, estamos acostumbrados a utilizar varias tarea en nuestro ordenador y, a veces, éstas son demasiado pesadas. Está bien, pero, si pasamos gran parte del día trabajando, puede que esa tarea pesada que estamos ejecutando, llegue un momento en el que no es prioritaria y tengamos que hacer otra cosa mientras, por lo que podemos pausarla y ya la reanudaremos luego cuando podamos destinar recursos a ello (puede que si la detenemos tengamos que empezar luego de nuevo, y eso tampoco está bien). Por cierto, para reanudar Firefox:

$ killall -SIGCONT firefox

La bombilla sobre la cabeza

Aunque, entonces se me ocurrió que podía tener una tecla rápida, tras la cual puedo seleccionar una ventana y pausar ese proceso automatizando todo el proceso, e incluso solucionando problemas; por ejemplo, si tengo varios perfiles de firefox y sólo quiero detener uno, con killall me los cargo todos, y con kill, tengo que saber la PID del firefox en concreto, y puede resultar complicado.

Para ello, voy a utilizar wmctrl, algunas herramientas del sistema, zenity para mostrar diálogos (uso KDE, pero zenity está más extendido) y notify-send para enviar notificaciones al entorno de escritorio en que nos encontramos acerca del estado de las órdenes que enviamos.

El script

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#!/bin/bash
WMCTRL=`which wmctrl`
ZENITY=`which zenity`
# Leave this variable as is. zenity will use it to keep
# associated to a Window and we don't want this
WINDOWID=
NOTIFY_SEND=`which notify-send`
NOTIFY_SEND_ARGS="-t 2000 -i window-duplicate"
# First implementation. No locales. Spanish for now

function already_stopped()
{
    WINPID=$1
    NAME="$2"

    $ZENITY --question --text "El proceso $2 está pausado. ¿Desea reanudarlo?" --title "Proceso pausado"
    RES=$?
    if [ "$RES" == "0" ]; then
    kill -SIGCONT $WINPID
    RES=$?
    if [ "$RES" == "0" ]; then
        $NOTIFY_SEND $NOTIFY_SEND_ARGS "Se ha reanudado el proceso $NAME"
    fi
    fi
}

function already_running()
{
    WINPID=$1
    NAME="$2"
    PCPU=`ps ax -o pid,pcpu | grep $WINPID | awk '{print $2}'`
    $ZENITY --question --text "El proceso $2 está corriendo y consumiendo "$PCPU"% de CPU. ¿Desea pausarlo?" --title "Proceso en curso"
    RES=$?
    if [ "$RES" == "0" ]; then
    kill -SIGSTOP $WINPID
    RES=$?
    if [ "$RES" == "0" ]; then
        $NOTIFY_SEND $NOTIFY_SEND_ARGS "Se ha pausado el proceso $NAME"
    fi
    fi
}

function state_changer()
{
    WINPID=$1
    STATUS=`cat /proc/$WINPID/status`
    NAME=`echo "$STATUS" | grep "Name:" | awk '{print $2}'`
    STATE=`echo "$STATUS" | grep "State:" | awk '{print $2}'`

    if [ "$STATE" == "T" ]; then
    already_stopped $WINPID "$NAME"
    else
    already_running $WINPID "$NAME"
    fi
}

function get_window()
{
    if [ "$1" == "Using" ]; then
        WINDOWLIST="`$WMCTRL -l -p | grep $3`"
        if [ -z "$WINDOWLIST" ]; then
            $ZENITY --error --text "No se encuentra la ventana seleccionada"
            exit
        fi
        WINPID=`echo "$WINDOWLIST" | awk '{print $3}'`
        state_changer $WINPID
    fi
}

$NOTIFY_SEND $NOTIFY_SEND_ARGS "Seleccione la ventana para ver el estado del proceso"
$WMCTRL -a :SELECT: -v 2>&1 | while read line; do get_window $line; done

Bueno, vamos a comentar esto un poco.

La joya de la corona, es wmctrl, con él, podemos pedirle información sobre una ventana, en este caso, una ventana a la que hacemos click, con :SELECT: una vez tenemos el ID de la ventana, podemos pedir una lista de ventanas incluyendo los PID de los procesos asociados (get_window()) y filtrar por el ID de la ventana en la que hemos hecho click.

Teniendo el PID, podemos averiguar el estado del proceso consultándolo en /proc/PID/status y podemos saber si lo habíamos pausado antes o no. Si no estaba pausado, lo pausamos (quise meter un diálogo por si hacemos click en una ventana equivocada. Si el proceso ya estaba pausado, nos da la opción de reanudarlo.

Advertencia

El funcionamiento teórico está bien, además funciona bien, puede detener cualquier proceso que tenga una ventana asociada, no estamos haciendo nada del otro mundo. Aunque hay procesos que no les sienta bien que los pausen, y puede que al reanudarlos tengan algún problema. Al ser procesos interactivos, muchas veces, todos los clicks que hemos hecho sobre ellos cuando estaban detenidos se producirán cuando lo reanudemos. En definitiva, que algunos procesos puede que se vuelvan inestables tras reanudarlos, pero no suele pasar.

En github

Este script forma parte de un proyecto que mantengo en github: gscripts, forks y stars son bienvenidos. Además, puede que cuando se publique el post, haya novedades en el repositorio.

También podría interesarte....

There are 15 comments left Ir a comentario

  1. Pingback: Pausar aplicaciones haciendo click en la ventana correspondiente | PlanetaLibre /

  2. WilliamSEO /
    Usando Google Chrome Google Chrome 120.0.0.0 en Windows Windows NT

    I truly welcome this superb post that you have accommodated us. I guarantee this would be advantageous for the majority of the general population. pasar 123 slot

  3. WilliamSEO /
    Usando Google Chrome Google Chrome 120.0.0.0 en Windows Windows NT

    I get a kick out of the chance to suggest only fine in addition to proficient data and realities, thus see it: 안전한 토토사이트

  4. jsimitseo /
    Usando Google Chrome Google Chrome 120.0.0.0 en Windows Windows NT

    Absolutely love the variety in these web slots. It’s a gaming feast for sure. สล็อตเว็บใหญ่

  5. WilliamSEO /
    Usando Google Chrome Google Chrome 120.0.0.0 en Windows Windows NT

    This is energizing, in any case it is imperative for you to visit this particular url: 먹튀커뮤니티

  6. jsimitseo /
    Usando Google Chrome Google Chrome 120.0.0.0 en Windows Windows NT

    I’m hesitant to invest in slots that might break after a short period. เว็บตรง แตกง่าย

  7. WilliamSEO /
    Usando Google Chrome Google Chrome 120.0.0.0 en Windows Windows NT

    Beaver says I additionally have such intrigue, you can read my profile here: 파워볼사이트

  8. jsimitseo /
    Usando Google Chrome Google Chrome 120.0.0.0 en Windows Windows NT

    You bear through a wonderful opening. I rational soundness unquestionably quarry it besides by and by propose to my buddys. I am reserved they assurance be profited from this scene. แหล่งรวมสล็อตทุกค่าย

  9. jsimitseo /
    Usando Google Chrome Google Chrome 120.0.0.0 en Windows Windows NT

    I finally found magnificent post here.I will get back here. I just added your blog to my bookmark regions. thanks.Quality presents is the fundamental on welcome the visitors to visit the webpage page, that is the thing that this site page is giving. 대구맛집

  10. jsimitseo /
    Usando Google Chrome Google Chrome 120.0.0.0 en Windows Windows NT

    2up Sports Social Game APP is the newest type of sports social entertainment game in the world in 2020’s. 2up Sports adapts to the web3 era and the wave of mobile internet, oriented to the personality, health, fashion, popularity, new trend, all-day socialization concept of the young generation of 00’s. 2up

  11. WilliamSEO /
    Usando Google Chrome Google Chrome 120.0.0.0 en Windows Windows NT

    Two full thumbs up for this magneficent article of yours. I’ve truly delighted in perusing this article today and I figure this may be outstanding amongst other article that I’ve perused yet. If it’s not too much trouble keep this work going ahead in a similar quality. situs slot 138

  12. WilliamSEO /
    Usando Google Chrome Google Chrome 120.0.0.0 en Windows Windows NT

    Extremely decent blog and articles. I am realy extremely glad to visit your blog. Presently I am discovered which I really need. I check your blog regular and attempt to take in something from your blog. Much obliged to you and sitting tight for your new post. 안전 토토사이트

  13. jsimitseo /
    Usando Google Chrome Google Chrome 120.0.0.0 en Windows Windows NT

    These sites are extremely required, you can take in a great deal. เว็บสล็อตโรม่า

  14. jsimitseo /
    Usando Google Chrome Google Chrome 120.0.0.0 en Windows Windows NT

    Beaver says I additionally have such intrigue, you can read my profile here: เกมป๊อกเด้งออนไลน์

  15. jsimitseo /
    Usando Google Chrome Google Chrome 121.0.0.0 en Windows Windows NT

    Beaver says I additionally have such intrigue, you can read my profile here: best concierge doctor

Leave a Reply