Czy istnieje oprogramowanie do okresowego uruchamiania i zamykania aplikacji?

11

Przykładowy przypadek użycia:

Chciałbym uruchamiać program Telegram Desktop okresowo co 3 godziny przez 15 minut, aby sprawdzać, czy są nowe wiadomości przychodzące. Po 15 minutach aplikacja powinna zamknąć się ponownie i uruchomić ponownie po następnych 3 godzinach.

orschiro
źródło
Byłoby to bardzo łatwe do napisania. Czy uruchomienie aplikacji tak by sprawdziło? Jeśli tak, jakie jest polecenie, aby je uruchomić?
Jacob Vlijm,
Dzięki cronniemu możesz wyraźnie uruchamiać programy. Możesz również cron a kill -15, ale zależy to od aplikacji, czy traktuje to jako delikatne naciśnięcie, aby zamknąć, ignoruje lub po prostu ulega awarii.
Harald

Odpowiedzi:

9

Cron a skrypt w tle

Oczywiście pierwszą rzeczą, która pojawia się w umyśle, jest użycie cron. To, czy używasz crona, czy małego skryptu w tle, zależy głównie od gustu.

Zaletą crona jest to, że łączy się z istniejącym procesem (chociaż skrypt nie dodaje, cóż, właściwie nic do obciążenia procesora).

Zaletą skryptu w tle jest to, że jest bardziej elastyczny; po prostu zabij go i uruchom z innymi argumentami, jeśli chcesz zmienić ustawienia czasu lub inne. Możesz także użyć go ponownie z innymi aplikacjami bez konieczności przeprowadzania kolejnej konfiguracji, wystarczy jedno polecenie.

Poniższy skrypt można uruchomić za pomocą polecenia (np.)

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

Gdzie ostatni argument, jeśli jest ustawiony, wymusza zabicie aplikacji. Jeśli nie zostanie ustawiony, aplikacja zamknie się z gracją, aby upewnić się, że ewentualne zmiany itp. Nie zostaną utracone.

Scenariusz

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

Używać

  • Skopiuj skrypt do pustego pliku i zapisz go jako cycle_run.py
  • Uruchom go za pomocą polecenia:

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

    gdzie:

    • <command>jest poleceniem do uruchomienia aplikacji (bez --%u-section, w moim przypadku skopiowane z .desktoppliku /home/jacob/Downloads/Telegram/Telegram:)
    • <cycle_time> to (całkowity) czas cyklu w minutach (3 godziny = 180 w twoim przykładzie)
    • <application_run_time> to czas, w którym aplikacja powinna działać w minutach (15 w twoim przykładzie)
    • forcejest opcjonalnym argumentem, aby wymusić zabicie aplikacji. Po prostu zostaw to, aby z wdziękiem zabić aplikację.

Uruchamianie aplikacji z argumentami

Jeśli uruchamiasz aplikację z argumentami, upewnij się, że używasz cudzysłowu wokół polecenia, aby uruchomić aplikację , np .:

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

Uruchamianie aplikacji zminimalizowane lub w zasobniku

Okresowe uruchamianie i kończenie aplikacji będzie często potrzebne tylko w zminimalizowanym zakresie i / lub w zasobniku. Zgodnie z wnioskiem OP kilka uwag na ten temat:

  • Jeśli aplikacja oferuje uruchomienie w zasobniku z wiersza poleceń, wystarczy użyć argumentu, aby to zrobić. W przypadku Telgramargumentu do użycia jest:

    -startintray
    

    chociaż opcja wydaje się nie działać na wszystkich systemach (działa na moim), jak wspomniano tutaj . Będziesz musiał przetestować w swojej sytuacji.

  • Jeśli aplikacja nie oferuje opcji wiersza polecenia do uruchomienia zminimalizowanego lub w zasobniku, sugerowałbym użycie (tego) skryptu w połączeniu ze skryptem tutaj (sugerowałbym pidwersję -), który umożliwi uruchomienie aplikacja zminimalizowana.

Jacob Vlijm
źródło
Drogi @JacobVlijm, masz niesamowity zestaw umiejętności! Dziękuję bardzo za ten świąteczny prezent. Twój skrypt działa świetnie. Podobnie jak „Zrób sobie przerwę”, mógłbym sobie wyobrazić, że ten skrypt zmienia się w przyjemny, prosty GUI, w którym użytkownik może zdefiniować aplikacje, czas cyklu i czas działania aplikacji. Ten GUI mógłby następnie uruchomić podczas uruchamiania, aby przygotować aplikacje, takie jak Telegram lub Skype. Co myślisz?
orschiro,
1
@orschiro brzmi idealnie! GUI jest prawie gotowe do użycia, z kilkoma zmianami :). Miłego Bożego Narodzenia!
Jacob Vlijm,
czy można zmusić aplikacje do otwarcia w trybie zminimalizowanym lub w tle?
orschiro
@orschiro oczywiście, co masz na myśli?
Jacob Vlijm
1
Cześć @orschiro dodał sekcję do odpowiedzi.
Jacob Vlijm,
5
  1. Edytuj crona za pomocą crontab -e i dodaj tę linię do swojego crontab, aby uruchomić ją jako zadanie harmonogramu co 3 godziny

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

2. Otwórz terminal i wpisz poniżej polecenie

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

otwórz killtelegram.sh ze swoim ulubionym edytorem i napisz jak poniżej

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

Zapisz i wyjdź

Otóż ​​to. Otworzy się automatycznie na każde 3 godziny i pozostanie na 15 minut i zostanie zabity.

rɑːdʒɑ
źródło
Cześć Raja, czy rozważyłbyś głosowanie w tej sprawie: askubuntu.com/tags/schedule/synonim ?
Jacob Vlijm