为什么此 systemd 服务阻止 PortAudio 查询音频设备?

为什么此 systemd 服务阻止 PortAudio 查询音频设备?

几个小时以来,我遇到了一个非常奇怪的问题,看起来真的是两个真正不相关的事情:Systemd 服务(什么都不做!)和可用音频设备的列表。

/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只需使用以下命令查询音频设备sounddevicePython 模块(PortAudio 的包装):

import sounddevice
print(sounddevice.query_devices(0))

这完美地工作并返回 1 个音频设备。

但是,当我添加第二个服务时 /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 能够查询有关音频设备的信息这一事实应该与第二个 Systemd 服务(由 启动udev)完全无关,它实际上什么也不做,您不这么认为吗?

我对这个将两个完全不相关的事物联系起来的错误真的一无所知。


注意:删除DefaultDependencies=false似乎可以解决问题。但我认为DefaultDependencies=false有必要避免服务在启动之前等待网络准备就绪。有没有没有此选项的另一种解决方案

相关内容