Automatize um processo usando o script bash

0

Eu tenho um processo de cliente unimrcp (ucp) e eu quero gerar vários ucp usando o shell script.

Sempre que eu desovar um ucp, ele retorna uma linha de comando usando o qual eu posso acessar diferentes funcionalidades no ucp. Então eu quero escrever um script que atenda a seguir,

  1. Gerar um processo de ucp
  2. espere até a linha de comando do ucp aparecer
  3. acesse a funcionalidade do ucp com o comando "run recog"

Observe que ./ucp & & executar o recog não funciona, já que o ./ucp é finalizado somente depois que saímos da linha de comando do ucp.

Eu tentei o seguinte para isso,

#!/bin/bash                                                                     
./ucp &                                                               
fg                                                                              
echo "run recog uni2"                                                           
wait                                                                            

No entanto, ./ucp & resulta em iniciar o processo do cliente e depois em "?????" no console do cliente resultando em "????" comando não encontrado. A seguir estão os registros,

./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: ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

Este é o caminho certo para alcançar o que eu mencionei na pergunta? (gerar um cliente e executar um comando em seu console)? Se sim, por que o "./ucp &" resulta na leitura "?????" considerando que, como entrada para o seu console? Observe que isso não acontece se eu simplesmente disparar "./ucp & fg" no console. Pode ver o comportamento esperado do comando quando o faço a partir da consola. O problema aparece quando tento executar o script.

Se este não for um caminho certo, como posso alcançar o que mencionei na pergunta? (1, 2 e 3)

Atualizar-- ./ucp & retorna o controle para um processo (acho que o processo de segundo plano), que considera todas as saídas impressas no terminal como entradas para o console de ./ucp. Eu acho que de alguma forma eu preciso transferir o controle IO para o processo ./ucp ou não? Não tenho certeza ..

Obrigado

    
por sbhatt 24.10.2018 / 22:37

2 respostas

1

A maneira complicada é usar expect , que falsifica um terminal completo para o processo ser reproduzido:

#!/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

Em seguida, você pode executar o script acima como runucp & ou o que você decidir chamá-lo em seu shell.

Como nota lateral, o método de entrada padrão mais simples echo blah | ... às vezes falhará, pois os programas podem descartar a entrada, por exemplo, um programa pode descartar todas as entradas antes de apresentar o primeiro prompt, lendo e descartando essa entrada:

% 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 >>><<<

ou por meio de uma chamada tcflush(3) . expect permite evitar essa condição por meio da chamada expect -x "detect prompt here" , o que indica que o processo gerado provavelmente está ativo e pronto para entrada.

    
por 25.10.2018 / 00:49
0

ucp aceita entrada em stdin? Se sim, tente enviar seu comando:

echo "run recog" | ./ucp
    
por 25.10.2018 / 00:05