¿Hay software para iniciar y cerrar una aplicación periódicamente?

11

Caso de uso ejemplar:

Me gustaría iniciar Telegram Desktop periódicamente cada 3 horas durante 15 minutos, para verificar si hay nuevos mensajes entrantes. Después de 15 minutos, la aplicación debería cerrarse nuevamente y reiniciarse después de las próximas 3 horas.

orschiro
fuente
Esto sería extremadamente fácil de escribir. ¿Comenzaría la aplicación, para que se verifique? Si es así, ¿cuál es el comando para ejecutarlo?
Jacob Vlijm
Con cronusted puede iniciar claramente los programas. También puede cron a kill -15, pero depende de la aplicación si lo maneja como un suave empujón para apagar, ignorarlo o simplemente se bloquea.
Harald

Respuestas:

9

Cron versus script de fondo

Por supuesto, lo primero que aparece en la mente es usar cron. Si usa cron o un pequeño script de fondo es principalmente una cuestión de gustos.

La ventaja de cron es que se conecta a un proceso existente (aunque un script agrega, bueno, en realidad nada a la carga del procesador).

La ventaja de un script de fondo es que es más flexible; simplemente mátelo y ejecútelo con otros argumentos si desea cambiar el tiempo u otras configuraciones. También puede reutilizarlo con otras aplicaciones sin tener que hacer otra configuración, solo un comando es suficiente.

El siguiente script puede ejecutarse mediante el comando (p. Ej.)

python3 <script> <command_to_run_application> <cycle_time> <application_run_time> force

Donde el último argumento, si se establece, mata por la fuerza la aplicación. Si no se configura, la aplicación se cerrará correctamente para asegurarse de que no se pierdan los posibles cambios, etc.

La secuencia de comandos

#!/usr/bin/env python3
import subprocess
import time
import sys

force = False
args = sys.argv[1:]; app = args[0].replace("'", "")
proc = app.split()[0].split("/")[-1]
cycle = int(args[1])*60; run = int(args[2])*60

try:
    if args[3] == "force":
        force = True
except IndexError:
    pass

def get_pid(proc_name):
    try:
        return subprocess.check_output(
            ["pgrep", proc_name]
            ).decode("utf-8").strip()
    except subprocess.CalledProcessError:
        pass

def kill(pid, force):
    if force == False:
        subprocess.Popen(["kill", "-s", "TERM", pid])
    elif force == True:
        subprocess.Popen(["kill", pid])

while True:
    subprocess.Popen(["/bin/bash", "-c", app])
    time.sleep(run)
    pid = get_pid(proc)
    if pid != None:
        kill(pid, force)
    time.sleep(cycle - run)

Usar

  • Copie el script en un archivo vacío, guárdelo como cycle_run.py
  • Ejecútalo con el comando:

    python3 /path/to/cycle_run.py <command> <cycle_time> <application_run_time> force
    

    dónde:

    • <command>es el comando para ejecutar la aplicación (sin la --%usección -en mi caso, copiada del .desktoparchivo /home/jacob/Downloads/Telegram/Telegram)
    • <cycle_time> es el tiempo de ciclo (total) en minutos (3 horas = 180 en su ejemplo)
    • <application_run_time> es el tiempo que la aplicación debe ejecutarse en minutos (15 en su ejemplo)
    • forcees un argumento opcional para matar forzosamente la aplicación. Simplemente déjelo alejado para matar con gracia la aplicación.

Ejecutar aplicaciones con argumentos

Si ejecuta una aplicación con argumentos, asegúrese de usar comillas alrededor del comando para ejecutar la aplicación , por ejemplo:

python3 /path/to/cycle_run.py 'gedit /home/jacob/Desktop/test.sh' 30 5

Ejecución de aplicaciones minimizadas o en bandeja

El inicio y la finalización de las aplicaciones periódicamente a menudo se necesitarán solo minimizadas y / o en la bandeja. Según lo solicitado por OP, algunas observaciones al respecto:

  • Si una aplicación ofrece iniciarse en la bandeja desde la línea de comandos, simplemente use el argumento para hacerlo. En el caso de Telgram, el argumento a usar es:

    -startintray
    

    aunque la opción parece no funcionar en todos los sistemas (sí funciona en el mío), como se menciona aquí . Tendrás que probar en tu situación.

  • Si la aplicación no ofrece la opción de línea de comando para iniciar minimizado o en la bandeja, sugeriría usar el script (this) en combinación con el aquí (sugeriría la pidversión -), lo que hará posible el inicio La aplicación minimizada.

Jacob Vlijm
fuente
Estimado @JacobVlijm, ¡tienes un conjunto de habilidades increíble! Muchas gracias por este regalo de navidad. Tu guión funciona muy bien. Al igual que "Tómese un descanso", me imagino que este script se convertirá en una interfaz gráfica de usuario agradable, simplemente, donde el usuario puede definir las aplicaciones, el tiempo de ciclo y el tiempo de ejecución de la aplicación. Esta GUI podría ejecutarse al inicio para preparar aplicaciones como Telegram o Skype. ¿Qué piensas?
orschiro
1
@orschiro suena perfecto! La interfaz gráfica de usuario está casi lista para usar, con algunos cambios :). ¡Que tengas una buena Navidad!
Jacob Vlijm
¿Sería posible forzar a las aplicaciones a abrir minimizadas o en segundo plano?
orschiro
@orschiro, por supuesto, ¿qué tienes en mente?
Jacob Vlijm
1
Hola @orschiro agregó una sección a la respuesta.
Jacob Vlijm
5
  1. Edite su cron con crontab -e y agregue esta línea en su crontab para ejecutarlo como trabajo programado por cada 3 horas

    00 */3 * * * * ~/killtelegram.sh >/dev/null 2>&1 
    

2. Abra su terminal y escriba el siguiente comando

touch ~/killtelegram.sh
chmod +x ~/killtelegram.sh

abra killtelegram.sh con su editor favorito y escriba lo siguiente

#!/bin/bash
telegram &
sleep 15m
pkill telegram

Guardar y Salir

Eso es. Se abrirá automáticamente por cada 3 horas y permanecerá durante 15 minutos y será asesinado.

rɑːdʒɑ
fuente
Hola Raja, ¿considerarías votar sobre esto: askubuntu.com/tags/schedule/synomains ?
Jacob Vlijm el