为什么我的程序直接运行却不能作为服务运行,这样可以很好地工作?Linux C



Goodday伙计们,

我正在尝试在linux(树莓)中构建并运行程序作为一项服务。这是一个使用Cerence SDK C API的示例应用程序,该应用程序实现唤醒词(WUW)加命令话语识别。

我可以通过执行它/name.exe或使用Makefile命令。

问题是,当我通过控制台执行程序时,它运行良好,没有任何问题。当我尝试将其作为服务执行时(同时使用systemd或crontab以及rc.local),会出现错误。

这是给我错误的函数:

printf("Selecting audio configuration %sn", audioScenarioName);
rc = nuance_audio_IAudioManager_activateScenario(audioMgr, audioScenarioName);
if (NUANCE_COMMON_OK != rc) {
printf("Audio scenario activation failed: %dn", rc); <-- returns 1 (error, impossible to activate scenario)
return rc;
}

ActivateScenario是一个函数,它只需在JSON文件和音频管理器(audioMgr)之后选择正确的麦克风(audioScenarioName)。不幸的是,如果出现问题,此函数将返回1,关闭程序,不执行其他操作。

这是JSON:

"type":                "AudioInput",
"name":                "mic_input",
"adapter_type":        "CUSTOM_AUDIO",
"adapter_params": {
"device_name": "default"
},
"audio_format":      { "uses": "16khz_1ch" }

该服务应以root权限运行(默认)。作为测试,我还尝试将整个文件夹设置为chmod -R 777,但问题相同。

这是我的服务:

[Unit]
Description=My Service
[Service]
Type=simple
ExecStart=+/home/pi/.../nameexec
Restart=on-failure
RestartSec=5
KillMode=process                        
[Install]
WantedBy=multi-user.target

我还在ld.so.conf文件中设置了它所需的lib目录的绝对路径。我放在里面的只有.so库,但没有.h.

我现在正试图了解以不同的方式启动同一个可执行文件可能会有什么不同。

可能是权限问题吗?还是没有检测到麦克风?有没有图书馆不合适?

我真的不知道为什么它与经典命令一起工作,而不是作为一项服务。有人能帮我做这个吗?

提前谢谢!

我成功了!问题出在正在使用的麦克风上。使用Raspbianv.Desktop,我从任务栏的右下角设置了麦克风,并更改了默认的输入/输出。但是这些设置似乎不是系统范围的,并且不被后台的服务使用(即使"用户="被设置为"pi")。

所以我不得不更改alsa.conf文件:

sudo nano /usr/share/alsa/alsa.conf

然后找到并编辑这些行:

defaults.ctl.card cardnumber
defaults.pcm.card cardnumber

您可以通过运行arecord -l来查找卡号

相关内容

最新更新