几个小时以来,我遇到了一个非常奇怪的问题,看起来真的是两个真正不相关的事情: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
只需使用以下命令查询音频设备sounddevice
Python 模块(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
有必要避免服务在启动之前等待网络准备就绪。有没有没有此选项的另一种解决方案?