Existe-t-il un logiciel pour démarrer et fermer périodiquement une application?

11

Cas d'utilisation exemplaire:

Je voudrais démarrer Telegram Desktop périodiquement toutes les 3 heures pendant 15 minutes, pour vérifier les nouveaux messages entrants. Après 15 minutes, l'application devrait se refermer et se relancer après les 3 heures suivantes.

orschiro
la source
Ce serait extrêmement facile à écrire. Est-ce que le démarrage de l'application suffirait à le faire vérifier? Si oui, quelle est la commande pour l'exécuter?
Jacob Vlijm
Avec cronvous pouvez clairement démarrer des programmes. Vous pouvez également créer un cron a kill -15, mais cela dépend de l'application, qu'il le gère comme un léger coup d'arrêt, qu'il l'ignore ou qu'il se bloque simplement.
Harald

Réponses:

9

Cron contre script d'arrière-plan

Bien sûr, la toute première chose qui vient à l'esprit est d'utiliser cron. Que vous utilisiez cron ou un petit script d'arrière-plan est principalement une question de goût.

L'avantage de cron est qu'il se connecte à un processus existant (bien qu'un script n'ajoute en fait rien à la charge du processeur).

L'avantage d'un script d'arrière-plan est qu'il est plus flexible; tuez-le simplement et exécutez-le avec d'autres arguments si vous souhaitez modifier l'heure ou d'autres paramètres. Vous pouvez également le réutiliser avec d'autres applications sans avoir à refaire une configuration, une simple commande suffit.

Le script ci-dessous peut être exécuté par la commande (par exemple)

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

Où le dernier argument, s'il est défini, tue de force l'application. S'il n'est pas défini, l'application se fermera normalement, pour s'assurer que les modifications éventuelles, etc. ne seront pas perdues.

Le scénario

#!/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)

Utiliser

  • Copiez le script dans un fichier vide, enregistrez-le sous cycle_run.py
  • Exécutez-le avec la commande:

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

    où:

    • <command>est la commande pour exécuter l'application (sans --%u-section, dans mon cas, copié du .desktopfichier: /home/jacob/Downloads/Telegram/Telegram)
    • <cycle_time> est le temps de cycle (total) en minutes (3 heures = 180 dans votre exemple)
    • <application_run_time> est le temps pendant lequel l'application doit s'exécuter en minutes (15 dans votre exemple)
    • forceest un argument facultatif pour tuer de force l'application. Laissez-le simplement pour tuer l'application avec grâce .

Exécution d'applications avec des arguments

Si vous exécutez une application avec des arguments, assurez-vous d'utiliser des guillemets autour de la commande pour exécuter l'application , par exemple:

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

Exécution d'applications minimisées ou dans le bac

Le démarrage et l'arrêt des applications périodiquement seront souvent nécessaires seulement minimisés et / ou dans le bac. Comme demandé par OP, quelques remarques à ce sujet:

  • Si une application propose de démarrer dans le bac à partir de la ligne de commande, utilisez simplement l'argument pour le faire. Dans le cas de Telgram, l'argument à utiliser est:

    -startintray
    

    bien que l'option ne semble pas fonctionner sur tous les systèmes (elle fonctionne sur le mien), comme mentionné ici . Vous devrez tester dans votre situation.

  • Si l'application n'offre pas l'option de ligne de commande au démarrage minimisé ou dans le bac, je suggère d'utiliser le (ce) script en combinaison avec celui ici (je suggère la pidversion -), ce qui permettra le démarrage l'application minimisée.

Jacob Vlijm
la source
Cher @JacobVlijm, vous avez des compétences incroyables! Merci beaucoup pour ce cadeau de Noël. Votre script fonctionne très bien. Identique à "Take a Break", je pourrais imaginer que ce script se transforme en une interface graphique simple et agréable où l'utilisateur peut définir la ou les applications, le temps de cycle et le temps d'exécution de l'application. Cette interface graphique pourrait ensuite s'exécuter au démarrage pour préparer des applications telles que Telegram ou Skype. Qu'est-ce que tu penses?
orschiro
1
@orschiro semble parfait! L'interface graphique est presque prête à l'emploi, avec quelques modifications :). Passez un bon Noël!
Jacob Vlijm
serait-il possible de forcer les applications à s'ouvrir au minimum ou en arrière-plan?
orschiro
@orschiro bien sûr, que pensez-vous?
Jacob Vlijm
1
Bonjour @orschiro a ajouté une section à la réponse.
Jacob Vlijm
5
  1. Modifiez votre cron avec crontab -e et ajoutez cette ligne dans votre crontab pour l'exécuter en tant que tâche planifiée toutes les 3 heures

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

Ouvrez votre terminal et tapez la commande ci-dessous

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

ouvrez killtelegram.sh avec votre éditeur favori et écrivez comme ci-dessous

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

Sauvegarder et quitter

c'est ça. Il s'ouvrira automatiquement toutes les 3 heures et il restera pendant 15 minutes et il sera tué.

rɑːdʒɑ
la source
Salut Raja, envisageriez-vous de voter sur ceci: askubuntu.com/tags/schedule/synonymes ?
Jacob Vlijm