Altere o volume do sistema usando o crontab & pactl

1

Estou tentando alterar o volume do sistema Ubuntu 14.04 usando o crontab. Eu estou usando o seguinte comando:

pactl set-sink-volume 1 75%

O que funciona bem quando eu uso no terminal ou quando eu executo o script que inclui este comando, mas quando o sistema executa este código do crontab ou via script que é executado no crontab, o sistema não altera o volume. Como posso consertar isso?

Eu também tentei

amixer -D pulse sset Master 75%

Crontab parece (a cada minuto para fins de teste)

* * * * * pactl set-sink-volume 1 75%

ou

* * * * * /usr/bin/pactl set-sink-volume 1 75\%
    
por Mart 20.09.2014 / 12:30

2 respostas

4

Demorou um pouco para descobrir, você pode fazer isso:

1 9 * * * export DISPLAY=:0 && amixer -D pulse sset Master 48000

1 22 * * * export DISPLAY=:0 && amixer -D pulse sset Master 32000

Em 100% o volume é aproximadamente 64000. Isso aumentará o volume em 9 e 22 em volume. Também no seu usuário crontab, não do sudo.

    
por TimeTraveller2100 30.01.2017 / 16:38
1

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.

    
por Jacob Vlijm 21.09.2014 / 12:03