2015-01-08 3 views
7

Я работаю над небольшим приложением, чтобы позвонить в школьные колокола по расписанию, которое можно обновить с веб-сайта. Все работает отлично, за исключением того, что сценарий, который запланирован как задание cron, не будет воспроизводить звук при запуске скрипта. Я добавил скрипт вывода и команды эха скрипту, чтобы проверить, работает ли cron, но часть, которая воспроизводит звук, не работает. Сценарий работает, как ожидается, при запуске вручную из CLI.Почему мой скрипт PHP cron не воспроизводится?

Скрипт извлекает время и звуковой файл для каждого периода дня по графике, а затем сравнивает время, связанное со звуковым файлом с текущим временем - если это матч, он будет

exec("/usr/bin/aplay /var/www/site/".$soundfile); 

Cron затем планируется запустить этот скрипт каждую минуту в течение учебного дня:

* 8-16 * 1-6,9-12 1-5 root /usr/bin/php -f /var/www/site/scripts/playsound.php > /dev/null 

Опять же, если я вручную запустить сценарий, когда есть звук по расписанию, звук воспроизводится через прилагаемые громкоговорители. Когда у меня есть тестовый код, который будет эхом на экран или выводится на введенный файл, cron будет выгружать вывод в файлы, подтверждая, что он запускает скрипт по расписанию. Он просто не будет воспроизводить звуковую часть скрипта.

Я проверил все мои права, и, поскольку все остальное работает, они кажутся точными. Я даже могу написать простой сценарий BASH, чтобы заставить Cron воспроизводить звук по расписанию, поэтому кажется, что система имеет право членства в группах для доступа к скрипту и звуковому файлу. Я отключил exec() для shell_exec(), попробовал использовать только команды, а также абсолютные пути к командам, а задание cron планируется запустить с правами root. Все еще не могу понять, почему эта небольшая функция, к сожалению, столь важная для этой программы, не будет работать.

Любые советы приветствуются.

+0

Это больше похоже на вопрос для другого сайта SE. Для Ubuntu есть ответ здесь: http://askubuntu.com/questions/530048/ubuntu-14-04-and-playing-songs-from-cron Может быть полезно в других вариантах nix. – developerwjk

+1

Попробуйте добавить это к exec: 'exec ('...>/tmp/cronlog 2> & 1')' и проверить файл журнала '/ tmp/cronlog', если есть какая-либо ошибка. Если 'aplay' нуждается в X, вам нужно убедиться, что root имеет доступ к активному сеансу X (см. Команду' xhost'). Возможно, вы захотите использовать пользователя, который имеет активный сеанс для задания cron. – fejese

+0

Это может помочь: http://stackoverflow.com/a/22744360/1163786 - Один совет: не подавляйте ошибки при отладке проблем cronjob. Повысить уровень ведения журнала. –

ответ

0

Вместо установки в хрон, используйте PHP интервал или Javascript (асинхронный - AJAX), чтобы вызвать предназначенный файл PHP. Я думаю, что это решит вашу проблему.

Выполнение задания cron на сервере не приведет к выходу вашего браузера.

Cron Job может отправлять уведомления/письма, обновлять/вставлять в db в определенные интервалы времени.

Для ваших требований вы должны запустить сценарий через браузер.

0

Как уже упоминалось в комментариях, вы действительно должны сохранять журналы, а затем исследовать их для подсказок.

Из того, что я помню из своих опытов, используя специальный скрипт, который выполняется PHP, может быть полезным. Вы загрузили бы скрипт bash имя звукового файла в качестве параметра. Например:

exec("/path/to/script.sh $SOUNDFILEPATH"); 

В сценарии вы можете настроить свой рабочий каталог, переменные окружения, и т.д.

Конечно, вы должны экранировать переменный, если вы хотите, чтобы избежать студентов получать озорную идею.

Один метод, который я всегда отбрасывал, когда становится жестким, состоит в том, чтобы иметь один скрипт, работающий под управлением cron, который контролируется файлом, хранящимся в say/tmp /, который вы можете писать через веб-сервер и PHP ,

Так что просто введите PHP для записи управляющих данных в файл/tmp (или любой другой доступный для записи каталог) и получите свой проверенный пользовательский скрипт bash, чтобы регулярно отслеживать его через cron. Это может быть так же просто, как наличие одной строки, указывающей на звуковой файл в вашем случае.

Это всегда сработало для меня без сюрпризов.

1

Возможно, разрешений для /dev/snd/pcmC0D0p. (Это устройство для карты ALSA 0: Устройство 0: воспроизведение.) Если на сервере работает сеанс рабочего стола, у него может быть демон pulseaudio, удерживающий устройство открытым.

Настройка множества пользователей, которые могут воспроизводить звук в одно и то же время, является беспорядочной и требует настройки pulseaudio в низкопроизводительном режиме, который не является нулевой копией, поэтому не делайте этого. Просто убедитесь, что сервер может только открыть звуковое устройство, когда это необходимо.

Чтобы увидеть, является ли ALSA звуковое устройство открыто или нет (независимо от состояния паузы или ж/д):

$ cat /proc/asound/card0/pcm0p/sub0/hw_params 
access: MMAP_INTERLEAVED 
format: S16_LE 
subformat: STD 
channels: 2 
rate: 44100 (44100/1) 
period_size: 8192 
buffer_size: 16384 

$ cat /proc/asound/card0/pcm1p/sub0/hw_params 
closed 

Таким образом, первый PCM воспроизведение на моей первой звуковой карты открыта, но второй PCM (выход S/PDIF для моей материнской платы) закрыт. Дальнейшее открытие звукового устройства работает только потому, что установка ALSA по умолчанию делает устройство «по умолчанию» оболочкой pulseaudio. hw:0 потерпит неудачу, потому что он занят, и на этой звуковой карте нет аппаратного микшера.

(Удовлетворительный факт: некоторые старые звуковые карты, например, некоторые карты PCI Soundblaster, поддерживаются несколько разрывов аппаратного устройства. Несколько потоков данных PCM могут быть DMAed на карту, где они будут смешиваться с помощью DSP. m совершенно неправильно, и драйвер ядра смешивался> < Но в любом случае вам не понадобилось пульсовое аудио, если у вас его было.)

0

Как я понимаю, cron | crontab работает в собственной среде; например, см обслуживаемого ответ на:

https://serverfault.com/questions/337631/crontab-execution-doesnt-have-the-same-environment-variables-as-executing-user

Таким образом, несмотря на то, aplay будет играть звук (WAV) файл при вызове в качестве обычного пользователя или корня (su | sudo), он не будет играть, что файл, когда он вызывается из cron - например, выполнение сценария bash (.sh), который содержит ваш оператор aplay).

Это работает на моей системе Arch Linux.

Вот мой cron_notification.sh сценарий:

#!/usr/bin/bash 

# /mnt/Vancouver/Programming/scripts/cron_notification.sh 

# For use with crontab [ sudo gedit /etc/crontab ] 
# cron (Arch Linux: cronie) requires full paths: 
# /usr/bin/aplay 
# /usr/bin/notify-send 

for i in 1 2 3 4 5 
    do 
    #aplay alarm.mp3 ## << aplay cannot play MP3 files; use WAV 
    # ---------------------------------------- 
    # NEEDED TO RUN 'aplay' FROM crontab: 
    # https://unix.stackexchange.com/questions/231941/cant-run-aplay-as-root 
    # https://www.reddit.com/r/linuxquestions/comments/37vcbo/playing_audio_from_a_cronjob/ 
    # PulseAudio needs XDG_RUNTIME_DIR, so: 

    XDG_RUNTIME_DIR=/run/user/`id -u` /usr/bin/aplay /mnt/Vancouver/Programming/scripts/PHASER.WAV 
    # ---------------------------------------- 
    sleep 0.25 
done 

# ---------------------------------------------------------------------------- 
# "Critical" alerts persist until clicked (i.e., do not appear, then fade after ~20"): 
# notify-send -u critical 'Hello Victoria!' 'Countdown has ended!' --icon=dialog-information 

/usr/bin/notify-send -u critical 'Hello Victoria!' "It's 3 pm!" -i /mnt/Vancouver/Programming/scripts/alert.jpg 

И, вот соответствующая часть моего /etc/crontab файла:

# /etc/crontab 

# system-wide crontab 
# edit: sudo {your favorite text editor: gedit; geany; ...} /etc/crontab 
# https://crontab.guru  ## online crontab values checker, planner 

# ===================================================================== 
# SHELL 
# ===================================================================== 

# cron (crontab) requires full paths: 
SHELL=/usr/bin/sh 
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 

# ===================================================================== 
# ARCH LINUX-RELATED [Arch Linux x86_64] 
# ===================================================================== 

# cron | https://wiki.archlinux.org/index.php/Cron 
# Will install, use "cronie" cron (crontab): 
# Install cronie: sudo pacman -Syu cronie 
# Enable cron: sudo systemctl enable --now cronie.service 
#  Start cron: sudo systemctl start cronie.service 
# Restart cron: sudo systemctl restart cronie.service 

# ===================================================================== 
# APLAY NOTIFICATION (3:00pm M-F) 
# ===================================================================== 

# Two issues when running 
# /mnt/Vancouver/Programming/scripts/cron_notification.sh 
# from cron: 

# ---------------------------------------- 
# 1. "notify-send": 

# https://bbs.archlinux.org/viewtopic.php?id=216912 
# notify-send also needs access to your DBUS_SESSION_BUS_ADDRESS. Assuming that your UID is 1000: 

DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/1000/bus" 

# More here: https://wiki.archlinux.org/index.php/Desktop_notifications#Usage_in_programming 

# ---------------------------------------- 
# 2. "aplay": 

# TO RUN 'aplay' FROM crontab: 
# https://www.reddit.com/r/linuxquestions/comments/37vcbo/playing_audio_from_a_cronjob/ 
# PulseAudio needs XDG_RUNTIME_DIR, so: 

# XDG_RUNTIME_DIR=/run/user/`id -u` /usr/bin/aplay /mnt/Vancouver/Programming/scripts/PHASER.WAV 

# Line above added to "/mnt/Vancouver/Programming/scripts/cron_notification.sh" script. 

# ---------------------------------------- 

# m h dom mon dow user nice command 

# "At 15:00 on every day-of-week from Monday through Friday” 
# [https://crontab.guru/#0_15_*_*_1-5]: 
0 15 * * 1-5 victoria nice -n 19 /usr/bin/bash /mnt/Vancouver/Programming/scripts/cron_notification.sh 

# NOTE -- running as user ("victoria"), not "root". 

# Test - every minute: 
#* * * * 1-5 victoria nice -n 19 /usr/bin/bash /mnt/Vancouver/Programming/scripts/cron_notification.sh 

Я оставил комментарии в месте, ссылки и ясности.

alert.jpg

notification

Вы можете скачать PHASER.WAV звуковой файл с моего сайта, здесь:

http://persagen.com/files/PHASER.WAV

Смежные вопросы