数時間、私は非常に奇妙な問題に直面しました。本当に二つのようです。本当に気にしないこと:システムサービス(何もしません!)と利用可能なオーディオデバイスのリスト。
/etc/systemd/system/myservice.service
より正確には、起動時にできるだけ早く実行されるサービスがあります。
[Unit]
Description=Test
DefaultDependencies=false
[Service]
Type=simple
ExecStart=/usr/bin/python /root/foo.py
WorkingDirectory=/root/
[Install]
WantedBy=local-fs.target
foo.py
以下を使用してオーディオデバイスに問い合わせます。sounddevice
Pythonモジュール(PortAudio用ラッパー):
import sounddevice
print(sounddevice.query_devices(0))
これは完全に機能し、1つのオーディオデバイスを返します。
ところで、2番目のサービスを追加すると /etc/systemd/system/[email protected]
実際には何もしません(最初はUSBデバイスをマウントします)。このソリューションを使用しかし、デバッグのためにこの部分を削除しても問題はまだ存在します! ):
[Unit]
Description=Mount USB Drive on %i
[Service]
Type=simple
ExecStart=/usr/bin/ls # note: normally here we should automount USB devices, but the bug is still there with just a simple ls that does nothing!
これは次のudevルールで始まります/etc/udev/rules.d/99-local.rules
。
KERNEL=="sd[a-z][0-9]", SUBSYSTEMS=="usb", ACTION=="add", RUN+="/bin/systemctl start usb-mount@%k.service"
...次のようにオーディオデバイスのクエリが失敗します。
Dec 10 22:51:27 foo foo.sh[116]: File "/usr/local/lib/python2.7/dist-packages/sounddevice.py", line 778, in __init__
Dec 10 22:51:27 foo foo.sh[116]: extra_settings, samplerate)
Dec 10 22:51:27 foo foo.sh[116]: File "/usr/local/lib/python2.7/dist-packages/sounddevice.py", line 2571, in _get_stream_parameters
Dec 10 22:51:27 foo foo.sh[116]: info = query_devices(device)
Dec 10 22:51:27 foo foo.sh[116]: File "/usr/local/lib/python2.7/dist-packages/sounddevice.py", line 569, in query_devices
Dec 10 22:51:27 foo foo.sh[116]: raise PortAudioError('Error querying device {0}'.format(device))
Dec 10 22:51:27 foo foo.sh[116]: sounddevice.PortAudioError: Error querying device 0
Dec 10 22:51:27 foo systemd[1]: foo.service: Main process exited, code=exited, status=1/FAILURE
Dec 10 22:51:27 foo systemd[1]: foo.service: Failed with result 'exit-code'.
この問題をデバッグする方法は?PortAudioがオーディオデバイスに関する情報を照会できるという事実は、udev
実際には何もしない2番目のSystemdサービス(で始まる)とまったく関係がないとは思いませんか?
私はまったく関係のない2つを結ぶ間違いについては全く知りません。
注:削除するとDefaultDependencies=false
問題が解決するようです。しかし、DefaultDependencies=false
始める前にネットワークが準備されるのを待つサービスは持続する必要があると思います。お持ちですか?このオプションがない他のソリューション?