Gibt es Software zum regelmäßigen Starten und Schließen einer Anwendung?

11

Beispielhafter Anwendungsfall:

Ich möchte Telegram Desktop regelmäßig alle 3 Stunden für 15 Minuten starten , um nach neu eingehenden Nachrichten zu suchen. Nach 15 Minuten sollte die Anwendung wieder geschlossen und nach den nächsten 3 Stunden neu gestartet werden.

Orschiro
quelle
Dies wäre extrem einfach zu skripten. Würde das Starten der Anwendung ausreichen, um sie überprüfen zu lassen? Wenn ja, wie lautet der Befehl zum Ausführen?
Jacob Vlijm
Mit können cronSie Programme klar starten. Sie können auch ein Cron kill -15erstellen, aber es hängt von der Anwendung ab, ob es als sanfter Anstoß zum Herunterfahren behandelt, ignoriert oder einfach abstürzt.
Harald

Antworten:

9

Cron versus Hintergrundskript

Natürlich ist das allererste, was einem in den Sinn kommt, die Verwendung cron. Ob Sie Cron oder ein kleines Hintergrundskript verwenden, ist hauptsächlich Geschmackssache.

Der Vorteil von cron besteht darin, dass es sich an einen vorhandenen Prozess anschließt (obwohl ein Skript der Prozessorlast eigentlich nichts hinzufügt ).

Der Vorteil eines Hintergrundskripts besteht darin, dass es flexibler ist. Beenden Sie es einfach und führen Sie es mit anderen Argumenten aus, wenn Sie die Zeit- oder andere Einstellungen ändern möchten. Sie können es auch mit anderen Anwendungen wiederverwenden, ohne ein anderes Setup durchführen zu müssen. Nur ein Befehl reicht aus.

Das folgende Skript kann mit dem Befehl (z.

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

Wenn das letzte Argument gesetzt ist, wird die Anwendung mit Gewalt beendet . Wenn nicht festgelegt, wird die Anwendung ordnungsgemäß geschlossen, um sicherzustellen, dass mögliche Änderungen usw. nicht verloren gehen.

Das Skript

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

Benutzen

  • Kopieren Sie das Skript in eine leere Datei und speichern Sie es unter cycle_run.py
  • Führen Sie es mit dem folgenden Befehl aus:

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

    wo:

    • <command>ist der Befehl , um die Anwendung auszuführen (ohne --%u-Abschnitt, in meinem Fall, kopiert aus der .desktopDatei: /home/jacob/Downloads/Telegram/Telegram)
    • <cycle_time> ist die (Gesamt-) Zykluszeit in Minuten (3 Stunden = 180 in Ihrem Beispiel)
    • <application_run_time> ist die Zeit, die die Anwendung in Minuten ausgeführt werden soll (15 in Ihrem Beispiel)
    • forceist ein optionales Argument, um die Anwendung gewaltsam zu beenden . Lassen Sie es einfach weg, um die Anwendung ordnungsgemäß zu beenden.

Ausführen von Anwendungen mit Argumenten

Wenn Sie eine Anwendung mit Argumenten ausführen, stellen Sie sicher, dass Sie Anführungszeichen um den Befehl verwenden, um die Anwendung auszuführen , z.

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

Ausführen von Anwendungen minimiert oder in der Taskleiste

Das regelmäßige Starten und Beenden von Anwendungen wird häufig nur minimiert und / oder in der Ablage benötigt. Auf Wunsch des OP einige Anmerkungen dazu:

  • Wenn eine Anwendung das Starten in der Taskleiste über die Befehlszeile anbietet, verwenden Sie dazu einfach das Argument. Im Fall von Telgramlautet das zu verwendende Argument:

    -startintray
    

    obwohl die Option nicht auf allen Systemen zu funktionieren scheint (auf meinen), wie hier erwähnt . Sie müssen in Ihrer Situation testen.

  • Wenn die Anwendung nicht die Befehlszeilenoption zum minimierten oder in der Taskleiste befindlichen Start bietet, würde ich empfehlen, das (dieses) Skript in Kombination mit dem hier beschriebenen (ich würde die pid- Version vorschlagen ) zu verwenden, um das Starten zu ermöglichen Die Anwendung wurde minimiert.

Jacob Vlijm
quelle
Lieber @JacobVlijm, du hast eine erstaunliche Fähigkeit! Vielen Dank für dieses Weihnachtsgeschenk. Ihr Skript funktioniert hervorragend. Genau wie bei "Take a Break" könnte ich mir vorstellen, dass dieses Skript zu einer schönen, einfachen GUI wird, in der der Benutzer die Anwendung (en), die Zykluszeit und die Laufzeit der Anwendung definieren kann. Diese GUI kann dann beim Start ausgeführt werden, um Anwendungen wie Telegramm oder Skype vorzubereiten. Was denkst du?
Orschiro
1
@orschiro klingt perfekt! Die GUI ist fast einsatzbereit, mit ein paar Änderungen :). Schöne Weihnachten!
Jacob Vlijm
Wäre es möglich, Anwendungen gezwungen zu öffnen, minimiert oder im Hintergrund zu öffnen?
Orschiro
@orschiro natürlich, was hast du vor?
Jacob Vlijm
1
Hi @orschiro hat der Antwort einen Abschnitt hinzugefügt.
Jacob Vlijm
5
  1. Bearbeiten Sie Ihre Cron mit crontab -e und fügen Sie diese Zeile in Ihre Crontab ein, um sie alle 3 Stunden als Zeitplanjob auszuführen

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

2.Öffnen Sie Ihr Terminal und geben Sie den folgenden Befehl ein

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

Öffnen Sie killtelegram.sh mit Ihrem bevorzugten Editor und schreiben Sie wie folgt

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

Speichern und schließen

das ist es. Es öffnet sich automatisch alle 3 Stunden und bleibt 15 Minuten lang und wird getötet.

rɑːdʒɑ
quelle
Hallo Raja, würdest du darüber nachdenken : askubuntu.com/tags/schedule/synonyms ?
Jacob Vlijm