2015-01-08 79 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

相關問題