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.


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.


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.


Cześć Raja, czy rozważyłbyś głosowanie w tej sprawie: askubuntu.com/tags/schedule/synonim ?
— Jacob Vlijm
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.