为什么我的程序直接 运行 可以正常工作,而不是作为服务? Linux丙
Why does my program work fine by running it directly but not as a service? Linux C
大家好,
我正在尝试在 linux (raspberry) 中构建 运行 程序作为服务。
这是一个示例应用程序,它使用 Cerence SDK C API 实现唤醒词 (WUW) 和命令语音识别。
我可以通过 ./name.exe 或使用 Makefile 命令来执行它。
问题是当我通过控制台执行程序时它工作正常,没有任何问题。
当我尝试将其作为服务执行时(同时使用 systemd 或 crontab 以及 rc.local),出现错误。
这是给我错误的函数:
printf("Selecting audio configuration %s\n", audioScenarioName);
rc = nuance_audio_IAudioManager_activateScenario(audioMgr, audioScenarioName);
if (NUANCE_COMMON_OK != rc) {
printf("Audio scenario activation failed: %d\n", rc); <-- returns 1 (error, impossible to activate scenario)
return rc;
}
ActivateScenario 它是一个简单地选择正确的麦克风 (audioScenarioName) 的函数,遵循 JSON 文件和音频管理器 (audioMgr)。
不幸的是,这个函数 returns 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.
我现在正在尝试了解以不同方式启动同一个可执行文件可能有什么不同。
会不会是权限问题?或者它没有检测到麦克风?有什么图书馆不合适吗?
我真的不知道为什么它适用于经典命令而不是作为服务。
有人可以帮我解决这个问题吗?
提前致谢!
我成功了!
问题是正在使用的麦克风。
使用 Raspbian 版本。桌面,我从任务栏的右下角设置了麦克风并更改了默认值 in/out。
但是这些设置似乎不是系统范围的,也没有被后台服务使用(即使“User=”设置为“pi”)。
所以我不得不更改 alsa.conf 文件:
sudo nano /usr/share/alsa/alsa.conf
然后找到并编辑这些行:
defaults.ctl.card cardnumber
defaults.pcm.card cardnumber
您可以通过运行arecord -l
找到卡号。
大家好,
我正在尝试在 linux (raspberry) 中构建 运行 程序作为服务。 这是一个示例应用程序,它使用 Cerence SDK C API 实现唤醒词 (WUW) 和命令语音识别。
我可以通过 ./name.exe 或使用 Makefile 命令来执行它。
问题是当我通过控制台执行程序时它工作正常,没有任何问题。 当我尝试将其作为服务执行时(同时使用 systemd 或 crontab 以及 rc.local),出现错误。
这是给我错误的函数:
printf("Selecting audio configuration %s\n", audioScenarioName);
rc = nuance_audio_IAudioManager_activateScenario(audioMgr, audioScenarioName);
if (NUANCE_COMMON_OK != rc) {
printf("Audio scenario activation failed: %d\n", rc); <-- returns 1 (error, impossible to activate scenario)
return rc;
}
ActivateScenario 它是一个简单地选择正确的麦克风 (audioScenarioName) 的函数,遵循 JSON 文件和音频管理器 (audioMgr)。 不幸的是,这个函数 returns 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.
我现在正在尝试了解以不同方式启动同一个可执行文件可能有什么不同。
会不会是权限问题?或者它没有检测到麦克风?有什么图书馆不合适吗?
我真的不知道为什么它适用于经典命令而不是作为服务。 有人可以帮我解决这个问题吗?
提前致谢!
我成功了! 问题是正在使用的麦克风。 使用 Raspbian 版本。桌面,我从任务栏的右下角设置了麦克风并更改了默认值 in/out。 但是这些设置似乎不是系统范围的,也没有被后台服务使用(即使“User=”设置为“pi”)。
所以我不得不更改 alsa.conf 文件:
sudo nano /usr/share/alsa/alsa.conf
然后找到并编辑这些行:
defaults.ctl.card cardnumber
defaults.pcm.card cardnumber
您可以通过运行arecord -l
找到卡号。