Esiste un software per avviare e chiudere periodicamente un'applicazione?


11

Caso d'uso esemplare:

Vorrei avviare periodicamente Telegram Desktop ogni 3 ore per 15 minuti, per verificare la presenza di nuovi messaggi in arrivo. Dopo 15 minuti, l'applicazione dovrebbe chiudersi di nuovo e riavviarsi dopo le 3 ore successive.


Questo sarebbe estremamente facile da scrivere. Avvio dell'applicazione farebbe, per farlo controllare? In tal caso, qual è il comando per eseguirlo?
Jacob Vlijm,

Con cronte puoi chiaramente iniziare i programmi. Potresti anche cron a kill -15, ma dipende dall'applicazione se lo gestisce come una leggera spinta per spegnerlo, ignorarlo o semplicemente arrestarsi in modo anomalo.
Harald,

Risposte:


9

Cron contro script di sfondo

Naturalmente la prima cosa che viene in mente è usare cron. Sia che tu usi cron o un piccolo script in background è principalmente una questione di gusti.

Il vantaggio di cron è che si collega a un processo esistente (anche se uno script aggiunge, in realtà, nulla al carico del processore).

Il vantaggio di uno script in background è che è più flessibile; basta ucciderlo ed eseguirlo con altri argomenti se si desidera modificare il tempo o altre impostazioni. Puoi anche riutilizzarlo con altre applicazioni senza dover eseguire un'altra installazione, basta un comando.

Lo script seguente può essere eseguito dal comando (ad es.)

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

Dove l'ultimo argomento, se impostato, uccide forzatamente l'applicazione. Se non impostato, l'applicazione verrà chiusa correttamente, per assicurarsi che eventuali modifiche, ecc. Non vengano perse.

Il copione

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

Usare

  • Copia lo script in un file vuoto, salvalo come cycle_run.py
  • Eseguilo con il comando:

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

    dove:

    • <command>è il comando per eseguire l'applicazione (senza il --%u-sezione, nel mio caso, copiato dal .desktopfile di: /home/jacob/Downloads/Telegram/Telegram)
    • <cycle_time> è il tempo di ciclo (totale) in minuti (3 ore = 180 nell'esempio)
    • <application_run_time> è il tempo di esecuzione dell'applicazione in minuti (15 nel tuo esempio)
    • forceè un argomento facoltativo per uccidere forzatamente l'applicazione. Basta lasciarlo per uccidere con grazia l'applicazione.

Esecuzione di applicazioni con argomenti

Se esegui un'applicazione con argomenti, assicurati di utilizzare le virgolette attorno al comando per eseguire l'applicazione , ad esempio:

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

Esecuzione di applicazioni ridotta a icona o nel vassoio

L'avvio e la chiusura periodica delle applicazioni saranno spesso necessari solo minimizzati e / o in vassoio. Come richiesto dall'OP, alcune osservazioni al riguardo:

  • Se un'applicazione offre l'avvio nella barra delle applicazioni dalla riga di comando, utilizzare semplicemente l'argomento per farlo. Nel caso di Telgram, l'argomento da usare è:

    -startintray
    

    anche se l'opzione sembra non funzionare su tutti i sistemi (lo fa sul mio), come menzionato qui . Dovrai testare nella tua situazione.

  • Se l'applicazione non offre l'opzione della riga di comando per l'avvio ridotto a icona o nella barra delle applicazioni, suggerirei di utilizzare lo script (this) in combinazione con quello qui (suggerirei la pid- versione), che consentirà l'avvio l'applicazione ridotta a icona.


Caro @JacobVlijm, hai una straordinaria abilità! Grazie mille per questo regalo di Natale. La tua sceneggiatura funziona alla grande. Come in "Take a Break", potrei immaginare che questo script si trasformi in una bella e semplice GUI in cui l'utente può definire le applicazioni, il tempo di ciclo e il tempo di esecuzione dell'applicazione. Questa GUI potrebbe quindi essere eseguita all'avvio per preparare applicazioni come Telegram o Skype. Cosa ne pensi?
Orschiro,

1
@orschiro sembra perfetto! La GUI è quasi pronta per l'uso, con alcune modifiche :). Buon Natale!
Jacob Vlijm,

sarebbe possibile forzare l'apertura delle applicazioni in modalità ridotta o in background?
Orschiro,

@orschiro ovviamente, cosa hai in mente?
Jacob Vlijm,

1
Ciao @orschiro ha aggiunto una sezione alla risposta.
Jacob Vlijm,

5
  1. Modifica il tuo cron con crontab -e e aggiungi questa linea nel tuo crontab per eseguirlo come processo di pianificazione per ogni 3 ore

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

2.Aprire il terminale e digitare il comando seguente

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

apri killtelegram.sh con il tuo editor preferito e scrivi come di seguito

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

Salva ed esci

questo è tutto. Si aprirà automaticamente ogni 3 ore e rimarrà per 15 minuti e verrà ucciso.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.