Debian

無法使用 Cron 安排音頻音量更改(直接在 cron、python 等中嘗試過……)

  • December 1, 2021

我在 Raspberry Pi 中發布了這個,但被告知它更適合一般的 linux 或程式領域。所以我想我現在會在這裡問…

我正在組裝一個應該播放影片的資訊亭。我正在將 NUC 與 Raspberry Pi Desktop 一起使用。一切正常,但使用 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

再次,它有效。耶。進入 Cron 。兩者都不:

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。所以這意味著我不能以 from 執行它sudo crontab -e,但我從使用者的 cron 開始執行它。

依然沒有。所以我嘗試將它作為 sudoer 執行,但事先與使用者一起執行。又什麼都沒有了。

請幫我。我只想自動調整音量,而不需要為我們每天設置​​三次的每個 NUC 登錄 ssh,直到我退出或退休。

謝謝!

在我得到所有幫助之後,我最終能夠找到解決方案。這不是我真正想要的解決方案,也不是很乾淨,但它有效,所以我在這裡發布。

我理解的問題

問題的核心似乎是,無論我做什麼,作為通用使用者執行 Amixer 都會提升到 Sudo 權限,並且讓另一個使用者只是執行音頻 Cronjobs 不起作用。

這導致通過終端手動發送的每個混音器命令將音量調整為最大 65536,通過 Cron 發送的每個命令最大調整為 88。無論我做什麼,這種巨大的差異都會導致音頻有效地靜音。

多虧了這裡兩個人的大量幫助,我得出的結論很可能是因為一個人正在嘗試執行 bash 而另一個人正在執行 sh。但讓兩者和解似乎是不可能的。

我最終放棄並完全改變了我如何一起執行物理組件……

所以,這是我的解決方案:

切換到 HDMI 到 AGP 適配器後,我插入了一個從 NUC 到電視的簡單 3.5 毫米公對公音頻插孔。我使用的電視允許來自 AGP 的影片和來自 3.5 毫米的音頻,所以現在我有影片到電視,但需要Stereo Output在 NUC 上切換到音頻才能讓它工作。

amixer scontents在此之後,我跑來跑去sudo amixer scontents查看資訊。Master正如我所期望的那樣顯示了兩個單獨的值,但PCM現在顯示了 255,這是以前沒有的。

考慮到這一點,我將注意力從 Master 更改為 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

現在一切都按我預期的方式工作,儘管使用音頻插孔會出現一些劈啪聲和其他小問題,但我只需要處理它們。

我知道這不是對問題最誠實的答案,但這是我在(字面上)與願意幫助我的人一起尋找和工作之後發現的唯一一個對我有用的答案。

我希望有人在某個時候看到這篇文章並比我走得更遠並找到解決方案。或者迅速放棄並繼續他們的生活,並對愚蠢的音頻插孔感到滿意。

但是我學到了很多東西,所以這就是一些東西。

我不在可以對此進行測試的地方,但是您所描述的類型失敗的常見原因是環境的差異。如果您從命令行執行,您可以輕鬆地看到這一點,並將該輸出與您作為作業執行的輸出進行比較。例如:cron``printenv``printenv``cron

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

您會在兩個輸出中看到許多差異。您可能能夠從列表中挑選,並確定造成問題的環境變數 - 我記得 RPi OS 為某些音頻和藍牙功能創建了特殊組,但我無法從記憶中回憶它們。

假設您使用bash的是您輸入命令的 shell,一個更簡單的方法可能是呼叫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 

引用自:https://unix.stackexchange.com/questions/672791