Измените системный том с помощью crontab и pactl

Я пытаюсь изменить системный том Ubuntu 14.04 с помощью crontab. Я использую следующую команду:

pactl set-sink-volume 1 75%

Который хорошо работает, когда я использую его в терминале или когда я запускаю скрипт, который включает эту команду, но когда система выполняет этот код от crontab или с помощью сценария, который работает на crontab, система не изменяет объем. Как я могу зафиксировать это?

Я также попробовал

amixer -D pulse sset Master 75%

Crontab похож (каждую минуту для тестирования цели)

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

или

* * * * * /usr/bin/pactl set-sink-volume 1 75\%
1
задан 20 September 2014 в 14:30

3 ответа

Взял меня некоторое время для понимания этого, можно сделать это:

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

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

На 100%-м объеме примерно 64 000. Это разбудит объем в 9, и вниз в 22. Также на Вашем пользователе crontab, не sudo's.

4
ответ дан 10 November 2019 в 18:23

Выполнение команд от крона

Хорошо работает и надежный во многих случаях, но когда Вы нуждаетесь или хотите запустить, например, приложения GUI, или в других ситуациях, где переменные среды включены, это может быть вполне поиск, чтобы узнать, как правильно установить (комбинация) задание (задания) крона, и узнать, какие переменные среды должны быть установлены и как.

Альтернатива

В этих ситуациях может быть удобно иметь простую альтернативу, выполнить команду в определенное время или даже запустить полную "дневную программу", от среды текущего пользователя.

Именно это ниже делает сценарий. Это выполняет команды и/или приложения, перечисленные в текстовом файле в простом формате, будучи похож:

11:09,gedit
11:10,gnome-terminal
11:20,pactl set-sink-volume 1 10%

Я протестировал его с Вашей командой, и это хорошо работает.

Как установить

Установка существует трех маленьких файлов, которые необходимо хранить в одной и той же папке. В одном из этих файлов (command_data.txt), необходимо перечислить команды, вместе со временем, Вы хотели бы, чтобы команды были выполнены, это - все.

Используйте следующий формат:

time/comma/command (no spaces around the comma)

повысить объем за 5 минут к 100%, например:

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%

Файлы:

Как сказано: эти три файла должны быть расположены в одной и той же папке.

файл 1, основной сценарий. Скопируйте его в пустой файл, сохраните его как schedule.py (сохраните имя, как это), и сделайте это исполняемым файлом (важный)

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

файл 2, сценарий для запущения/останавливания расписания. Сохраните его как run_schedule.py (сохраните имя, как это), и сделайте это исполняемым файлом (важный)

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

файл 3, создайте пустой файл, названный command_data.txt заполните его своими командами, как объяснено в, "Как установить"

запустите / остановка (переключатель) расписание командой:

/path/to/run_schedule.py

Сообщение уведомления появится:

enter image description here или: enter image description here

Объяснение

Что делают файлы:

Когда сценарий schedule.py запускается, это читает команды и их запланированное время выполнения от command_data.txt. В цикле текущее время сравнивается с запланированным временем перечисленных команд. Если текущее время равняется одному или нескольким запланированных времен задания, команда выполнена и отмечена, как "сделано" в течение текущего времени.

Сценарий run_schedule.py проверки, если основной сценарий (schedule.py) работает. Если так, задание уничтожается, в противном случае сценарий запускается. В обоих случаях уведомление о подтверждении отображено.

1
ответ дан 10 November 2019 в 18:23

Начиная с Ubuntu 19.10 , простой DISPLAY =: 0 (или даже 0.0) не помог в cron, я получил эту ошибку:

Connection failure: Connection refused
pa_context_connect() failed: Connection refused

Вместо этого мне пришлось сделать следующее (это мой mute-at-night cron, но вы можете приспособиться к своим потребностям):

30 21 * * * bash -l -c "DISPLAY=:0.0 pactl --server unix:/run/user/1000/pulse/native set-sink-mute 0 on"

Разбивка:

  • bash -l для оболочки входа.
  • DISPLAY =: 0.0 для отображения
  • - сервер unix: / run / user / 1000 / pulse / native (обратите внимание, что я жестко запрограммировал мой $ UID)
  • 0 : первое аудиоустройство. Для конкретного устройства вы можете использовать полное имя устройства, например alsa_output.pci-0000_00_1f.3.analog-stereo
  • on (или off ): отключение звука вкл. / Выкл.

В Ubuntu 19.10 мне пришлось добавить - server arg.

1
ответ дан 9 February 2020 в 03:05

Другие вопросы по тегам:

Похожие вопросы: