Bashスクリプトを使用したプロセスの自動化

Bashスクリプトを使用したプロセスの自動化

unimrcpクライアントプロセス(ucp)があり、シェルスクリプトを使用して複数のucpsを生成しようとしています。

ucpを作成するたびに、ucpのさまざまな機能にアクセスできるコマンドラインが返されます。だから私は次の目標を達成するためにスクリプトを書いてみたいと思います。

  1. UCPプロセスの作成
  2. ucpコマンドラインが表示されるのを待ちます。
  3. ucpの機能にアクセスするには、「ru​​n Recog」コマンドを使用します。

./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)

更新 - ./ucp &端末に印刷されたすべての出力を./ucpコンソールへの入力として処理するプロセス(私の意見ではバックグラウンドプロセスのようです)として制御を返します。どういうわけかIO制御を./ucpプロセスに転送する必要がありますか?わからない。

ありがとう

ベストアンサー1

洗練されたアプローチは、expectこれを使用して端末全体を偽にし、次の場所でプロセスが実行されるようにすることです。

#!/usr/bin/env expect
# Spawn a ucp process
spawn -noecho ucp
# wait until the ucp's command line appears
expect -ex "whatever the ucp command line prompt looks like here"
# access ucp's functionality with a command "run recog"
send -- "run recog\r"
# not sure what needs to happen here, so let's wait for
# ucp to exit (may also need to handle timeout or 
# the output buffer being full or ...)
expect eof

runucp &その後、上記のスクリプトを実行できますが、シェルから呼び出すことにしました。

ちなみに、単純なecho blah | ...stdinは、プログラムが入力を削除できるため、時には失敗します。たとえば、プログラムはその入力を読み取って削除し、最初のプロンプトを表示する前にすべての入力を削除できます。

% cat prompter
#!/usr/bin/env expect
sleep 3         ;# simulate load of something big and bloated
read stdin      ;# toss any existing input
puts -nonewline "prompt> "
puts "got >>>[gets stdin]<<<"
% print -l a b c d e f g | ./prompter
prompt> got >>><<<

またはtcflush(3)電話で。生成されたプロセスが開始され、入力する準備ができたことを示し、これを防ぐための呼び出しをexpect許可します。expect -x "detect prompt here"

おすすめ記事