Cronを使用してオーディオボリュームの変更をスケジュールすることはできません(cron、Pythonなどから直接試してください)。

Cronを使用してオーディオボリュームの変更をスケジュールすることはできません(cron、Pythonなどから直接試してください)。

私はこれをRaspberry Piに投稿しましたが、一般的にLinuxやプログラミングに適していると言われました。だから今ここに尋ねたいと思いました...

ビデオを再生するキオスクを設定する予定です。私はRaspberry PiデスクトップでNUCを使用しています。すべてがうまく機能しますが、Cronを使用してオーディオを自動化します。学校で働くのに日中は爆発音が少しひどいので時間帯に合わせて変えてほしいです。

次のコードは、端末で実行されると機能します。

/usr/bin/amixer set Master 16384

そして

amixer sset 'Master' 16384

だからCronに入れました。

15 09 * * * /usr/bin/amixer set Master 16384

そして

43 09 * * * amixer sset 'Master' 16384

何もありません。美しい。だから私は実行する非常に単純なPythonスクリプトを作成しました。 (はい、システムフォルダに入れて移動しようとしたら、ただそこにいるようになりました。)

#!/usr/bin/env python3

from subprocess import call
call(["/usr/bin/amixer", "set", "Master", "65536"])

私はそれを実行可能にしました。

chmod +x /etc/python/sound100.py

その後、端末から呼び出します。

/etc/python/sound100.py

そして

/usr/bin/python3 /etc/python/sound100.py

繰り返しますが、うまくいきます。うん。クローンに入ります。どれでもない:

11 10 * * * python3 /etc/python/sound100.py

...でもない

11 10 * * * /usr/bin/python3 /etc/python/sound100.py

でも

11 10 * * * /etc/python/sound100.py

何も動作しません。

したがって、実際のトラブルシューティングが始まります。システムログを確認してください。すべてが実行中ですが、sudoコマンドで実行すると、sudoerで実行したときに最大ボリュームが83であることがわかりました。つまり、で実行することはできませんが、sudo crontab -eユーザーのcronで実行を開始するという意味です。

まだ何もありません。だから私はsudoerで実行してみましたが、事前にユーザーと一緒に実行しました。もう何もありません。

助けてください。 SSHにログインしなくても、ボリュームが自動的に調整され、ログアウトまたは引退するまで1日3回配置された各NUCを提供したいと思います。

ありがとうございます!

答え1

いろいろな助けを受けた最後についに解決策を見つけました。これは事実私が望んだ解決策でもなく、あまりきれいでもありませんが、効果があってここに投稿します。

私が理解するもの

問題の核心は、私が何をしてもAmixerをユニバーサルユーザーとして実行するとSudo権限に昇格し、他のユーザーにオーディオcronjobを実行させることは機能しないことです。

これにより、端末を介して手動で送信されたすべてのamixerコマンドはボリュームを最大65536に調整し、Cronを介して送信されたすべてのコマンドはボリュームを最大88に調整します。この大きな違いにより、私が何をしてもオーディオは効果的にミュートされます。

ここでは、2人の多くの助けのおかげで、おそらくある人はbashを実行しようとし、他の人はshを実行しているからであるという結論に達しました。しかし、両者の和解は不可能に見える。

結局、あきらめて物理的なコンポーネントを一緒に実行する方法を完全に変えました。

だからこれは私の解決策です。

HDMI-AGPアダプタに切り替えた後、NUCのシンプルな3.5mm男性 - 男性オーディオジャックをテレビに接続しました。私が使用しているテレビはAGPのビデオと3.5mmのオーディオを受け入れるので、ビデオをテレビにストリーミングできますが、Stereo Output機能するにはNUCからオーディオに切り替える必要があります。

その後、情報をamixer scontents確認するために走りました。予想通り、2つの個別の値が表示されますが、今は以前はなかった255が表示されます。sudo amixer scontentsMasterPCM

これを念頭に置いて、マスターからPCMにフォーカスを切り替え、次のようにCrontabを更新しました。

40 06 * * 1-5 amixer sset 'PCM' 191 2> /tmp/cronVolumeLog

25 07 * * 1-5 amixer sset 'PCM' 64 2> /tmp/cronVolumeLog

40 14 * * 1-5 amixer sset 'PCM' 128 2> /tmp/cronVolumeLog

オーディオジャックを使用すると、ちょっとしたカチカチ音やその他のマイナーな問題があるかもしれませんが、すべてが今のように動作しますが、これを処理する必要があります。

私はこれが質問に対する最も正直な答えではないことを知っていますが、私を喜んで助けたい人を(文字通り)数日間検索し、一緒に働いた後に私が見つけた唯一の答えです。

いつか誰かがこの記事を読んで、私よりも良い解決策を見つけることを願っています。または、すぐにあきらめ、彼らの人生を生きて、愚かなオーディオジャックに満足してください。

でもたくさん学んだからそういうことです。

答え2

今はテストするところはありませんが、よくcronあなたが説明する失敗タイプの理由は次のとおりです。環境printenvコマンドラインから実行し、その出力をタスクとして実行した結果と比較すると、printenvそれを簡単に確認できます。cron例えば:

* * * * * /path/to/printenv > /home/pi/cron_env.txt 2>&1 

2つの出力の間に多くの違いがあることがわかります。リストから選択し、問題を引き起こす環境変数を識別できます。 RPi OSが特定のオーディオおよびBluetooth機能用に特別なグループを作成したことを覚えていますが、メモリからそのグループを呼び出すことはできません。

bashコマンドを入力するシェルを使用するとします。bash -lより簡単なアプローチは、次のコマンドを呼び出して実行することですcrontab

15 09 * * * bash -l /usr/bin/amixer set Master 16384 
43 09 * * * bash -l /usr/bin/amixer sset 'Master' 16384

stderrそして、コメントで提案されているように、リダイレクトを使用してファイルのすべての出力をキャプチャすることは常に良い考えですamixer

15 09 * * * bash -l /usr/bin/amixer set Master 16384 2> /home/pi/cronErrorLog.txt 

答え3

OPが拡張されるにつれて、cronによるamixerの実行はsudoユーザーとして実行されます。私が見つけたのは、「マスターデバイス」の代わりにAV出力を制御する「ヘッドフォン」または同様のデバイスがあることです。ボリュームレベルの元の値を操作する必要はありません。パーセントを使用して音量を希望のレベルに設定するだけです。つまり

15 09 * * * /usr/bin/amixer set Master 100\%

注:上記の例では、パーセント記号がエスケープされています。

答え4

私の解決策は

* * * * * export XDG_RUNTIME_DIR=/run/user/1000 && /usr/bin/amixer -D pulse sset Master 50\%

私の環境にはXDG_RUNTIME_DIRが必要なようです。

関連情報