我有一个 unimrcp 客户端进程 (ucp),我想使用 shell 脚本生成多个 ucp。
每当我生成一个 ucp 时,它都会返回一个命令行,我可以使用这个命令行访问 ucp 中的不同功能。因此,我想编写一个脚本来实现以下功能:
- 生成一个 ucp 进程
- 等到 ucp 的命令行出现
- 使用命令“run recog”访问 ucp 的功能
请注意,./ucp && run recog 不起作用,因为只有在退出 ucp 命令行后 ./ucp 才完成。
为此,我尝试了以下方法,
#!/bin/bash
./ucp &
fg
echo "run recog uni2"
wait
但是,./ucp &
这会导致启动客户端进程,然后在客户端控制台上写入“????”,导致“????”命令未找到。以下是日志,
./script.sh
2018-10-23 14:36:53:618851 [INFO] Set Property ip:127.0.0.1
2018-10-23 14:36:53:618851 [INFO] Register Codec [PCMU]
2018-10-23 14:36:53:618851 [INFO] Register Codec [PCMA]
2018-10-23 14:36:53:618851 [INFO] Register Codec [L16]
2018-10-23 14:36:53:618851 [NOTICE] Register Resource [speechsynth]
2018-10-23 14:36:53:618851 [NOTICE] Register Resource [speechrecog]
2018-10-23 14:36:53:620588 [NOTICE] Register Resource [recorder]
2018-10-23 14:36:53:620588 [NOTICE] Register Resource [speakverify]
2018-10-23 14:36:53:620593 [INFO] Register Resource Factory
2018-10-23 14:36:53:620600 [NOTICE] Create SofiaSIP Agent [SIP-Agent-1] [1.12.11-227-g73efc97] sip:127.0.0.1:8062;transport=udp
2018-10-23 14:36:53:620600 [INFO] Register Signaling Agent [SIP-Agent-1]
2018-10-23 14:36:53:620600 [NOTICE] Create RTSP Client [RTSP-Agent-1] [100]
2018-10-23 14:36:53:620600 [INFO] Register Signaling Agent [RTSP-Agent-1]
2018-10-23 14:36:53:620600 [NOTICE] Create MRCPv2 Agent [MRCPv2-Agent-1] [100]
2018-10-23 14:36:53:620600 [INFO] Register Connection Agent [MRCPv2-Agent-1]
2018-10-23 14:36:53:620600 [NOTICE] Create Media Engine [Media-Engine-1]
unknown command: ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
这是实现我在问题中提到的正确方法吗?(生成客户端并在其控制台上运行命令)?如果是,为什么“./ucp &”会导致读取“?????”,认为这是控制台的输入?请注意,如果我只是从控制台触发“./ucp & fg”,则不会发生这种情况。当我从控制台执行命令时,它可以看到命令的预期行为。当我尝试执行脚本时,会出现问题。
如果这不是正确的方法,我该如何实现我在问题中提到的内容?(1、2 和 3)
谢谢
答案1
听起来您想将输入发送到后台进程的标准输入。一种方法是使用命名管道。
# Create a named pipe
mkfifo /tmp/ucp-input
# Run the background service using the named pipe as stdin
cat /tmp/ucp-input | ./ucp &
# Echo commands to the named pipe to send them to the service's stdin
echo "run recog uni2" > /tmp/ucp-input
我已经使用一个简单的 Bash 脚本对此进行了测试,该脚本仅回显输入并且它似乎按预期工作。