Я пытаюсь изменить системный том 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 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.
Хорошо работает и надежный во многих случаях, но когда Вы нуждаетесь или хотите запустить, например, приложения 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
Сообщение уведомления появится:
или:
Что делают файлы:
Когда сценарий schedule.py
запускается, это читает команды и их запланированное время выполнения от command_data.txt
. В цикле текущее время сравнивается с запланированным временем перечисленных команд. Если текущее время равняется одному или нескольким запланированных времен задания, команда выполнена и отмечена, как "сделано" в течение текущего времени.
Сценарий run_schedule.py
проверки, если основной сценарий (schedule.py
) работает. Если так, задание уничтожается, в противном случае сценарий запускается. В обоих случаях уведомление о подтверждении отображено.
Начиная с 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.