2015-01-08 82 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会将输出转储到文件中,确认它正在按计划运行脚本。它只是不会播放脚本的darn声音部分。

我检查了我的所有权限,因为其他所有的工作都是正确的。我甚至可以编写一个简单的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

而不是设置为的cron的,使用PHP间隔的javascript(异步 - AJAX)调用预期PHP文件。我认为这会解决你的问题。

在服务器中执行的cron作业,它不会向您的浏览器抛出任何输出。

Cron作业很好地发送通知/邮件,更新/插入到数据库在特定的时间间隔。

根据您的要求,您必须通过浏览器运行脚本。

0

正如其他人在评论中提到的,你必须保存日志,然后检查他们的线索。

从我使用由PHP执行的专用脚本的经验中回忆起来可能是有益的。您可以将bash脚本作为参数提供声音文件的名称。例如:

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

在脚本中你可以设置你的工作目录,环境变量等

当然,如果你想避免学生越来越调皮的想法,你必须逃脱的变量。

当遇到困难时,我一直使用的一种技术是在cron下运行一个脚本,该脚本由存储在say/tmp /中的文件控制,您可以通过Web服务器和PHP 。

因此,只需让PHP将控制数据写入/ tmp(或任何其他可写目录)中的文件,并让您的测试用户bash脚本通过cron定期监控它。它可以像在你的情况下有一条线指向声音文件一样简单。

这对我来说一直没有意外。

1

可能对/dev/snd/pcmC0D0p的权限是问题所在。 (这是ALSA Card 0:Device 0:播放的设备。)如果服务器上正在运行桌面会话,则可能会有一个pulseaudio守护进程保持设备处于打开状态。

为多个用户设置能够同时播放声音的东西是一团糟,并且要求在非零拷贝的低性能模式下配置pulseaudio,所以不要这样做。只需确保服务器可以在需要时专门打开声音设备。

要看到ALSA声音设备是否打开或不(不考虑暂停状态或W/E的):

$ 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数据流可以被DMA存储到卡上,在那里它们将被DSP混合,除非我' m完全错误,并且内核驱动程序混合> <但是无论如何,如果你有一个,你不需要pulseaudio。)

0

据我所知,cron | crontab运行在它自己的环境中;例如,见接受的答案是:

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

因此,即使当作为一个普通用户或作为根(su | sudo)调用aplay将播放声音(WAV)文件,它不会播放文件,当它从cron被调用 - 例如,执行包含您的aplay语句的bash(.sh)脚本)。

这是适用于我的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

相关问题