Existe software para iniciar e fechar periodicamente um aplicativo?

10

Caso de uso exemplar:

Eu gostaria de começar o Telegram Desktop periodicamente a cada 3 horas por 15 minutos, para verificar se há novas mensagens recebidas. Após 15 minutos, o aplicativo deve fechar novamente e relançar após as próximas 3 horas.

    
por orschiro 24.12.2015 / 20:36

2 respostas

7

Cron versus script de plano de fundo

É claro que a primeira coisa que surge na mente é usar cron . Se você usa o cron, ou um pequeno script de background é principalmente uma questão de gosto.

A vantagem do cron é que ele se conecta a um processo existente (embora um script adicione, na verdade, nada ao carregamento do processador).

A vantagem de um script de segundo plano é que é mais flexível; simplesmente mate-o e execute-o com outros argumentos, se quiser alterar a hora ou outras configurações. Você também pode reutilizá-lo com outros aplicativos sem ter que fazer outra configuração, apenas um comando é suficiente.

O script abaixo pode ser executado pelo comando (por exemplo,

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

Onde o último argumento, se definido, forçosamente mata o aplicativo. Se não for definido, o aplicativo fechará normalmente, para garantir que possíveis alterações, etc., não sejam perdidas.

O script

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

Para usar

  • Copie o script em um arquivo vazio, salve-o como cycle_run.py
  • Execute-o com o comando:

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

    onde:

    • <command> é o comando para executar o aplicativo (sem o --%u -section, no meu caso, copiado do arquivo .desktop : /home/jacob/Downloads/Telegram/Telegram )
    • <cycle_time> é o tempo de ciclo (total) em minutos (3 horas = 180 no seu exemplo)
    • <application_run_time> é o tempo que o aplicativo deve ser executado em minutos (15 no seu exemplo)
    • force é um argumento opcional, para forçar matar o aplicativo. Simplesmente deixe-o fora para graciosamente matar o aplicativo.

Executando aplicativos com argumentos

Se você executar um aplicativo com argumentos, certifique-se de usar aspas ao redor do comando para executar o aplicativo , por exemplo:

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

Execução de aplicativos minimizados ou na bandeja

O início e o término de aplicativos periodicamente geralmente serão necessários apenas minimizados e / ou na bandeja. Conforme solicitado pelo OP, algumas observações sobre isso:

  • Se uma aplicação oferece iniciar na bandeja a partir da linha de comando, simplesmente use o argumento para fazer isso. No caso de Telgram , o argumento a ser usado é:

    -startintray
    

    embora a opção pareça não funcionar em todos os sistemas (como na minha), como mencionado aqui . Você terá que testar em sua situação.

  • Se o aplicativo não oferecer a opção de linha de comando para inicialização minimizada ou na bandeja, sugiro usar o script (this) em combinação com o aqui (eu sugeriria o pid - version), o que tornaria possível inicializar o aplicativo minimizado.

por Jacob Vlijm 24.12.2015 / 22:35
4
  1. Edite seu cron com crontab -e e adicione esta linha no seu crontab para executá-la como trabalho de programação para cada 3 horas

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

2.Abra o terminal e digite abaixo o comando

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

abra o killtelegram.sh com o seu editor favorito e escreva como abaixo

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

Salvar e sair

é isso. Ele será aberto automaticamente a cada 3 horas e permanecerá por 15 min e será morto.

    
por Ten-Coin 24.12.2015 / 21:47