Executando comandos do cron
Funciona bem e confiável em muitas ocasiões, mas quando você precisa ou quer executar, por exemplo, aplicativos GUI, ou em outras situações onde variáveis de ambiente estão envolvidas, pode ser uma pesquisa para descobrir como configurar corretamente um de cron job (s), e descobrir quais variáveis de ambiente devem ser definidas e como.
Alternativa
Nessas situações, pode ser conveniente ter uma alternativa simples, executar um comando em um horário específico ou até executar um "programa diário" completo, a partir do ambiente do usuário atual.
Isso é o que o script abaixo faz. Ele executa comandos e / ou aplicativos, listados em um arquivo de texto em um formato simples, parecido com:
11:09,gedit
11:10,gnome-terminal
11:20,pactl set-sink-volume 1 10%
Eu testei com o seu comando e funciona bem.
Como configurar
A configuração existe de três arquivos pequenos, que você precisa armazenar em uma e na mesma pasta. Em um desses arquivos ( command_data.txt
), você precisa listar os comandos, juntamente com a hora em que você deseja que os comandos sejam executados, isso é tudo.
Use o seguinte formato:
time/comma/command (no spaces around the comma)
para aumentar o volume em 5 minutos para 100%, por exemplo:
11:20,pactl set-sink-volume 1 0%
11:21,pactl set-sink-volume 1 20%
11:22,pactl set-sink-volume 1 40%
11:23,pactl set-sink-volume 1 60%
11:24,pactl set-sink-volume 1 80%
11:25,pactl set-sink-volume 1 100%
Os arquivos:
Como dito: os três arquivos devem estar localizados em uma e na mesma pasta.
arquivo 1, o script principal.
Copie-o para um arquivo vazio, salve-o como schedule.py
(mantenha o nome como está) e torne-o executável (importante)
#!/usr/bin/env python3
import subprocess
import time
import datetime
import os
cmd_data = os.path.dirname(os.path.abspath(__file__))+"/command_data.txt"
with open(cmd_data) as data:
s = [item.strip().split(",")+[None] for item in data.readlines()]
def currtime(set_time):
return int(set_time.split(":")[0])*60+int(set_time.split(":")[1])
def run_command(t, now, cmd, last_run):
if currtime(t) == now and last_run != int(time.strftime("%d%m%Y"))+int(now):
subprocess.Popen(["/bin/bash", "-c", cmd])
else:
pass
while True:
now = currtime(str(datetime.datetime.now().time())[:5])
for i in range(len(s)):
cmdata = s[i]
run_command(cmdata[0], now, cmdata[1], cmdata[2])
s[i][2] = int(time.strftime("%d%m%Y"))+int(now)
time.sleep(30)
arquivo 2, o script para iniciar / interromper o cronograma.
Salve como run_schedule.py
(mantenha o nome como está) e torne-o executável (importante)
#!/usr/bin/env python3
import os
import subprocess
script_dir = os.path.dirname(os.path.abspath(__file__))
cmd = "ps -ef | grep schedule.py"
run = subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8").split("\n")
match = [line for line in run if script_dir+"/"+"schedule.py" in line]
if len(match) != 0:
subprocess.Popen(["kill", match[0].split()[1]])
subprocess.Popen(["notify-send", "Schedule stopped..."])
else:
subprocess.Popen(["/bin/bash", "-c", script_dir+"/"+"schedule.py"])
subprocess.Popen(["notify-send", "Schedule runs..."])
arquivo 3, crie um arquivo vazio chamado command_data.txt
preenchê-lo com seus comandos, conforme explicado em "Como configurar"
iniciar / parar (alternar) a programação pelo comando:
/path/to/run_schedule.py
Uma mensagem de notificação será exibida:
ou:
Explicação
O que os arquivos fazem:
Quando o script schedule.py
é iniciado, ele lê os comandos e o tempo de execução agendado de command_data.txt
. Em um loop, o horário atual é comparado ao horário planejado dos comandos listados. Se a hora atual for igual a um ou mais horários de trabalho agendados, o comando é executado e marcado como "concluído" para a hora atual.
O script run_schedule.py
verifica se o script principal ( schedule.py
) está sendo executado. Se assim for, o trabalho é morto, se não, o script é iniciado. Em ambos os casos, uma notificação de confirmação é exibida.