以下を使用して、プログラムが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
cron
てbash
それを置き換えるために自分のスクリプトを書いたので、今は起動時にターミナルでこれを実行します。私は中に多くのテストを試してみましたcron
:whoami
私のユーザー名を示しており、echo ~ $PWD
両方は私のホームディレクトリを表示します。ルートターミナルから取得するのと同じ応答であるを/usr/bin/pacmd list-sink-inputs >> $LOG_FILE 2>&1
示しますNo PulseAudio daemon running, or not running as session daemon.
。(続き)
ps -fl
、cron
スクリプトがスーパーユーザー特権で実行されていることを示しますが、呼び出されたものps
は通常(ps
ルート端末から実行されるように)実行されpulseaudio
、フラグ1
(forked but didn't exec
)でプロセスリストに表示されます。現時点ではこれを理解できませんが、あなたの質問には賛成票を投じる価値があります。
crontab
行をコメントアウトし、新しいターミナルを起動してから実行しますwhile sleep 120; do /home/balajeerc/.i3/utils/idle_check_suspend.sh; done
-めったに使用されないワークスペースで最小化することをお勧めします。
crontab
エントリーは正確に何ですか?この問題は、シェル環境とでコマンドを実行するシェル環境の違いが原因であると思われますcron
。とのpacmd
両方へのフルパスを含めてリダイレクトする価値がstdout
ありstderr
ます。