Existe software para iniciar e fechar periodicamente um aplicativo?

11

Exemplo de uso:

Gostaria de iniciar 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 reiniciar após as próximas 3 horas.

orschiro
fonte
Isso seria extremamente fácil de script. Iniciando o aplicativo, para fazê-lo verificar? Se sim, qual é o comando para executá-lo?
27630 Jacob Vlijm
Com cronvocê pode iniciar claramente os programas. Você também pode programar um cron kill -15, mas depende do aplicativo se ele o manipula como uma cutucada suave para desligar, ignorar ou travar.
Harald

Respostas:

9

Script Cron versus Background

É claro que a primeira coisa que surge na mente é usar cron. Se você usa cron ou um pequeno script em segundo plano, é 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 à carga do processador).

A vantagem de um script em segundo plano é que é mais flexível; basta matá-lo e executá-lo com outros argumentos, se desejar alterar o tempo ou outras configurações. Você também pode reutilizá-lo com outros aplicativos sem precisar 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, mata forçosamente o aplicativo. Se não estiver definido, o aplicativo será fechado 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)

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 .desktoparquivo: /home/jacob/Downloads/Telegram/Telegram)
    • <cycle_time> é o tempo (total) do ciclo em minutos (3 horas = 180 no seu exemplo)
    • <application_run_time> é o tempo em que o aplicativo deve ser executado em minutos (15 no seu exemplo)
    • forceé um argumento opcional, para matar com força o aplicativo. Simplesmente deixe-o para matar graciosamente o aplicativo.

Executando aplicativos com argumentos

Se você executar um aplicativo com argumentos, use 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

Aplicativos em execução minimizados ou na bandeja

Iniciar e encerrar aplicativos periodicamente geralmente será necessário apenas minimizado e / ou na bandeja. Conforme solicitado pelo OP, algumas observações sobre isso:

  • Se um aplicativo oferecer inicialização na bandeja a partir da linha de comando, basta usar 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 (funciona no meu), conforme mencionado aqui . Você terá que testar 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 script aqui (sugiro a pidversão -), o que tornará possível a inicialização o aplicativo minimizado.

Jacob Vlijm
fonte
Caro @JacobVlijm, você tem um conjunto de habilidades incrível! Muito obrigado por este presente de Natal. Seu script funciona muito bem. Assim como "Faça uma pausa", eu poderia imaginar que esse script se transformasse em uma GUI agradável, simplesmente onde o usuário pode definir o (s) aplicativo (s), o tempo de ciclo e o tempo de execução do aplicativo. Essa GUI pode ser executada na inicialização para preparar aplicativos como Telegram ou Skype. O que você acha?
Orschiro
1
@orschiro parece perfeito! O gui está quase pronto para uso, com algumas alterações :). Tenha um bom Natal!
Jacob Vlijm
seria possível forçar a abertura de aplicativos minimizados ou em segundo plano?
orschiro
@orschiro, é claro, o que você tem em mente?
Jacob Vlijm
1
Oi @orschiro adicionou uma seção à resposta.
27630 Jacob Vlijm
5
  1. Edite seu cron com crontab -e e adicione esta linha ao seu crontab para executá-lo como tarefa de agendamento a cada 3 horas

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

2. Abra seu terminal e digite o comando abaixo

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

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

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

Salvar e sair

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

rɑːdʒɑ
fonte
Oi Raja, você consideraria votar nisto: askubuntu.com/tags/schedule/synonym ?
Jacob Vlijm