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.