2015-01-08 5 views
7

私はスケジュールに従って学校の鐘を鳴らすための小さなアプリケーションに取り組んでいます。これはウェブサイトから更新することができます。スクリプトが実行されたときにcronジョブがサウンドを再生しないようにスケジュールされているスクリプトを除いて、すべてがうまくいっています。スクリプトに出力配管とエコーコマンドを追加して、cronが実行していることを確認しましたが、サウンドを再生する部分は機能しません。このスクリプトは、CLIから手動で実行したときに正常に動作します。私のPHP cronスクリプトがサウンドを再生しないのはなぜですか?

スクリプトは、時間とスケジュールで一日の各期間の音声ファイルを抽出し、その後、現在の時刻と音声ファイルに関連付けられた時間を比較する - それは試合だ場合、それは

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

クロンは、その後の学校の日中の毎分このスクリプトを実行するようにスケジュールされています。そこには音予定されているとき、私は手動でスクリプトを実行した場合

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

ここでも、音は添付のスピーカーから再生されます。テストコードが画面に表示されたり、入力されたファイルに出力されたりすると、cronは出力をファイルにダンプし、スクリプトがスケジュール通りに実行されていることを確認します。それはちょうどスクリプトの厄介な音の部分を再生しません。

私のすべてのアクセス許可を確認しましたが、それ以外はうまく動作しているため、正確であるようです。私はスケジュールで音を出すためにシンプルなBASHスクリプトを書くことさえできるので、スクリプトとサウンドファイルの両方にアクセスするための正しいグループメンバーシップがシステムにあるようです。私はshell_exec()exec()を交換しました。コマンドだけでなく、コマンドへの絶対パスを使ってみました。そして、cronジョブはrootとして実行するようにスケジュールされています。残念ながらこのプログラムの成功に不可欠なこの小さな機能がうまくいかない理由はまだ分かりません。

アドバイスをいただければ幸いです。意図したPHPファイルを呼び出すために - その代わりにcronとして設定するので

+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非同期)を使用します。私はこれがあなたの問題を解決すると思います。

サーバーで実行中のcronジョブは、ブラウザに出力されません。

Cronの仕事は、通知/メールを送信し、特定の間隔でDBに更新/挿入するとよいです。

要件に応じて、ブラウザでスクリプトを実行する必要があります。

0

コメントに他の人が言及しているように、実際にはログを保存してから手がかりを調べる必要があります。

PHPが実行する専用のスクリプトを使用して私の経験から思い出されたことは有益です。 bashスクリプトに、サウンドファイルの名前をパラメータとして渡します。たとえば:あなたはいたずらのアイデアを取得し、学生を避けたい場合は、もちろんなどのセットアップ作業ディレクトリ、環境変数、

することができますスクリプトで

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

、あなたは変数をエスケープする必要があります。

私はいつも厳しい状況に陥っていますが、1つのスクリプトをcronの下で実行することです。これは、/ tmp /に格納されたファイルによって制御され、WebサーバーとPHP 。

だからPHPで/ tmp(または他の書き込み可能なディレクトリ)内のファイルに制御データを書き込むために取得し、cronを介して、それを定期的に監視するために、あなたのテストユーザーのbashスクリプトを取得します。あなたのケースでは、サウンドファイルを指し示す1行のように簡単なことがあります。

これはいつも驚くことなく私のために働いています。

1

おそらく/dev/snd/pcmC0D0pのアクセス許可が問題です。 (これはALSA Card 0:Device 0:再生のためのデバイスです。)サーバー上でデスクトップセッションが実行されている場合、デバイスを開いたままにしておくpulseaudioデーモンがあります。

複数のユーザーが同時にサウンドを再生できるように設定することは混乱し、zero-copyではない低パフォーマンスモードでpulseaudioを設定する必要があります。必要に応じてサーバがサウンドデバイスを排他的に開くことができることを確認してください。

$ 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:ALSAサウンドデバイスが(関係なく、一時停止状態またはW/Eの)オープンであるかどうかを確認するには

(私のマザーボードオーディオのS/PDIF出力)が閉じられています。サウンドデバイスのさらなるオープンは、デフォルトのALSAセットアップが「デフォルト」デバイスをパルスオーディオラッパーにするためにのみ機能します。 hw:0はビジーで、このサウンドカードにはハードウェアミキサーがないため、失敗します。

(面白いことに、いくつかのPCIサウンドブラスターカードなど、いくつかの古いサウンドカードは、ハードウェアデバイスの複数のオープンをサポートしています。)PCMデータの複数ストリームをDSPにミックスし、完全に間違ってMとカーネルドライバが混合された> <しかし、あなたは1を持っていた場合は、とにかく、あなたはPulseAudioは必要ありませんでした)

0

私はそれを理解し、それ自身の環境でcron | crontab実行。。。例えば、で受け入れ答えを参照してください。aplay音(WAV)通常のユーザーとして、またはrootとして呼び出されたときにファイル再生されますにもかかわらず、このように

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

suを| sudo)、それはそれを再生されませんあなたのaplayステートメントを含むbash(.sh)スクリプトを実行しているなど、cronから呼び出されたときのファイル)。

これは、私の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