pacmd-cronで動作しないのはなぜですか?


1

以下を使用して、プログラムがpulseaudioシンクに書き込みを行っているかどうかを確認しています。

pacmd list-sink-inputs

これは端末からすぐにうまく機能します。これは私にこの出力を与えます:

1 sink input(s) available.
    index: 4
    driver: <protocol-native.c>
    flags: START_CORKED 
    state: RUNNING
    sink: 0 <alsa_output.pci-0000_00_1b.0.analog-stereo>
    volume: front-left: 24144 /  37% / -26.02 dB,   front-right: 24144 /  37% / -26.02 dB
            balance 0.00
    muted: no
    current latency: 59.33 ms
    requested latency: 25.00 ms
    sample spec: float32le 2ch 48000Hz
    channel map: front-left,front-right
                 Stereo
    resample method: copy
    module: 7
    client: 3 <Firefox>
    properties:
        media.name = "AudioStream"
        application.name = "Firefox"
        native-protocol.peer = "UNIX socket client"
        native-protocol.version = "30"
        application.process.id = "1241"
        application.process.user = "balajeerc"
        application.process.host = "smallguy"
        application.process.binary = "firefox"
        application.language = "en_IN"
        window.x11.display = ":0"
        application.process.machine_id = "82f34b545d7441ad9439148d54b19c2e"
        application.process.session_id = "c2"
        application.icon_name = "firefox"
        module-stream-restore.id = "sink-input-by-application-name:Firefox"

ただし、これをcronジョブの一部として実行すると、オーディオが再生されている場合でも何も(空の文字列)が表示されません。

なぜそうなるのでしょうか?

編集:以下のコメントのいくつかに応えて、私はさらにいくつかのことを試しました。私は現在、フルパスでそれを実行しています:

/usr/bin/pacmd list-sink-inputs >> $LOG_FILE 2>&1

これは、前述のstdoutが空であるため、基本的にstderrに出力される次のログをスローします。

No PulseAudio daemon running, or not running as session daemon.

私のcrontabエントリは次のとおりです。

*/2 * * * * /home/balajeerc/.i3/utils/idle_check_suspend.sh

これはユーザーのcrontabエントリであり、ルートではありません。

どこidle_check_suspend.sh私pacmdコールがあるスクリプトがあります。

システムインフォメーション:

Kernel version: 4.8.0-49-generic
Ubuntu 16.04

pacmd 8.0
Compiled with libpulse 8.0.0
Linked with libpulse 8.0.0

crontabエントリーは正確に何ですか?この問題は、シェル環境とでコマンドを実行するシェル環境の違いが原因であると思われますcron。とのpacmd両方へのフルパスを含めてリダイレクトする価値がstdoutありstderrます。
AFH

@AFHあなたがテストしたことを試し、私の投稿を更新しました。
バラジェール

似たようなテストであなたとまったく同じことを観察していますが、私はその最下位に到達するのに本当に苦労しています。確かに、過去に私は非常に苦労しcronbashそれを置き換えるために自分のスクリプトを書いたので、今は起動時にターミナルでこれを実行します。私は中に多くのテストを試してみましたcronwhoami私のユーザー名を示しており、echo ~ $PWD両方は私のホームディレクトリを表示します。ルートターミナルから取得するのと同じ応答であるを/usr/bin/pacmd list-sink-inputs >> $LOG_FILE 2>&1示しますNo PulseAudio daemon running, or not running as session daemon.。(続き)
AFH

1つの手がかりはps -flcronスクリプトがスーパーユーザー特権で実行されていることを示しますが、呼び出されたものpsは通常(psルート端末から実行されるように)実行されpulseaudio、フラグ1forked but didn't exec)でプロセスリストに表示されます。現時点ではこれを理解できませんが、あなたの質問には賛成票を投じる価値があります。
AFH

今のところ私が提案できる最善の方法は回避策です:crontab行をコメントアウトし、新しいターミナルを起動してから実行しますwhile sleep 120; do /home/balajeerc/.i3/utils/idle_check_suspend.sh; done-めったに使用されないワークスペースで最小化することをお勧めします。
AFH

回答:


1

セキュリティと利便性のため、ほとんどのディストリビューションでは、pulseaudioが/ run / user /にあるユーザーの組み込みストレージをデーモン制御に使用しています。cronでは、関連する環境変数が設定されていないため、使用するパスがわかりません。スクリプトで次のように設定する必要があります。

export PULSE_RUNTIME_PATH="/run/user/$(id -u)/pulse/"

デフォルトのパスでない場合は、$ PULSE_RUNTIME_PATH変数をエコーし​​て、現在どこを指しているのかを調べることもできます。


0

おそらくpacmdプログラムへのフルパスを指定する必要があります。 /usr/local/bin/pacmd


2
それを試しました。うまくいきませんでした。それを試した結果で私の投稿を更新しました。
バラジェール

0

pacmdコマンドはユーザーセッションターミナルコマンドで機能しますが、シェルスクリプトで使用するとpulseaudioデーモンへのアクセスに問題が生じる可能性があります

同等のpactlコマンドのスクリプト内のコマンドを変更

pactl list sink-inputs

スクリプトはアクティブなシンク入力がないことを確認するためにヌル応答をチェックしているため、以下からの短縮された(おそらくより速い)応答のみが必要な場合があります。

pactl list short sink-inputs

pactl list short sink-inputs

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.