Eu tenho um servidor unimrcp em contêiner e ele está sendo executado como pod kubernetes. Quando entro no container e faço ps -ef
sua saída é assim:
[root@unimrcp-0 fd]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 99 13:13 ? 01:07:38 ./unimrcpserver
root 75 1 0 13:13 ? 00:00:00 [arping] <defunct>
root 76 1 0 13:13 ? 00:00:00 [arping] <defunct>
root 154 0 0 13:14 pts/0 00:00:00 /bin/bash
root 209 154 0 14:21 pts/0 00:00:00 ps -ef
Além disso, se eu fizer cat /proc/[pid]/fd/1
isso, estou vendo alguma saída corrompida como esta:
comando desconhecido: ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
Por que não há terminal de controle conectado ao processo. Eu desativei o Unimrcp do log para o stdout. Além disso, a utilização da CPU é de 99%. Alguém por favor pode ajudar a resolver isso?
Este é o ponto de entrada do contêiner
#!/bin/sh
source /ip-conf.sh; set_control_media_network "UNIMRCP"
CONTROL_IP=$(get_control_ipv4)
MEDIA_IP=$(get_media_ipv4)
LOG_LEVEL=$(echo $LOG_LEVEL | tr -s " " | xargs)
LOG_OUTPUT=$(echo $LOG_OUTPUT | tr -s " " | xargs)
LOG_HEADERS=$(echo $LOG_HEADERS | tr -s " " | xargs)
sed -i 's+<priority>.*</priority>+''<priority>'$LOG_LEVEL'</priority>+g'
/usr/local/unimrcp/conf/logger.xml
sed -i 's+<output>.*</output>+''<output>'$LOG_OUTPUT'</output>+g'
/usr/local/unimrcp/conf/logger.xml
sed -i 's+<headers>.*</headers>+''<headers>'$LOG_HEADERS'</headers>+g'
/usr/local/unimrcp/conf/logger.xml
sed -i 's+<!-- <ip>.*</ip> -->+''<ip>'$CONTROL_IP'</ip>+g'
/usr/local/unimrcp/conf/unimrcpserver.xml
sed -i 's+<!-- <rtp-ip>.*</rtp-ip> -->+''<rtp-ip>'$MEDIA_IP'</rtp-ip>+g'
/usr/local/unimrcp/conf/unimrcpserver.xml
cd /usr/local/unimrcp/bin/
exec ./unimrcpserver
Esta é a saída do ls -l no /proc/1/fd/ dentro do contêiner unimrcp
total 0
lrwx------ 1 root root 64 Jan 2 12:04 0 -> /dev/null
l-wx------ 1 root root 64 Jan 2 12:04 1 -> pipe:[17601930]
l-wx------ 1 root root 64 Jan 2 12:04 10 -> pipe:[17605635]
lrwx------ 1 root root 64 Jan 2 12:04 11 -> socket:[17605636]
lrwx------ 1 root root 64 Jan 2 12:04 12 -> anon_inode:[eventpoll]
lrwx------ 1 root root 64 Jan 2 12:04 13 -> anon_inode:[eventfd]
lrwx------ 1 root root 64 Jan 2 12:04 14 -> anon_inode:[eventpoll]
lrwx------ 1 root root 64 Jan 2 12:04 15 -> anon_inode:[eventfd]
lrwx------ 1 root root 64 Jan 2 12:04 16 -> anon_inode:[eventpoll]
lrwx------ 1 root root 64 Jan 2 12:04 17 -> socket:[17602110]
lrwx------ 1 root root 64 Jan 2 12:04 18 -> socket:[17602111]
lrwx------ 1 root root 64 Jan 2 12:04 19 -> anon_inode:[eventpoll]
l-wx------ 1 root root 64 Jan 2 12:04 2 -> pipe:[17601931]
lrwx------ 1 root root 64 Jan 2 12:04 20 -> socket:[17603083]
lrwx------ 1 root root 64 Jan 2 12:04 21 -> socket:[17603084]
lr-x------ 1 root root 64 Jan 2 12:04 22 -> /dev/urandom
lrwx------ 1 root root 64 Jan 2 12:04 23 -> socket:[17603087]
lrwx------ 1 root root 64 Jan 2 12:04 24 -> socket:[17603088]
l-wx------ 1 root root 64 Jan 2 12:04 3 ->
/usr/local/unimrcp/log/unimrcpserver_2020.01.02_12.04.08.988860.log
lrwx------ 1 root root 64 Jan 2 12:04 4 -> anon_inode:[eventpoll]
lr-x------ 1 root root 64 Jan 2 12:04 5 -> pipe:[17605633]
l-wx------ 1 root root 64 Jan 2 12:04 6 -> pipe:[17605633]
lrwx------ 1 root root 64 Jan 2 12:04 7 -> socket:[17605634]
lrwx------ 1 root root 64 Jan 2 12:04 8 -> anon_inode:[eventpoll]
lr-x------ 1 root root 64 Jan 2 12:04 9 -> pipe:[17605635]
Você precisa colocar aspas duplas em suas expansões de variáveis.
No comando
a expansão variável
$LOG_HEADERS
não está entre aspas. Isso significa que, se a variávelLOG_HEADERS
contiver espaços, ela será dividida em várias palavras (e cada palavra também sofrerá globbing de nome de arquivo).Isso significa que se
$LOG_HEADERS
for a stringA B C
, você receberá o comandoNeste comando,
B
,C</headers>+g
e/usr/local/unimrcp/conf/logger.xml
serão considerados como nomes de caminho dos arquivos a serem processados, e ased
expressãos+<headers>.*</headers>+<headers>A
a ser aplicada a esses arquivos contém um erro de sintaxe.Sempre aspas duplas em qualquer expansão de variável. Há casos em que não é necessário usar aspas duplas em uma expansão, mas é muito mais fácil lembrar de sempre usar aspas duplas.
Seu comando seria parecido com
ou
(na verdade, haveria apenas um único
sed
comando, pois você pode facilmente juntar várias edições em uma invocação separando cada expressão com;
ou fornecendo-e 'expression'
argumentos separados).Você também precisa colocar aspas duplas nas expansões ao usá-las com
echo
.Observe também que analisar XML é muito mais fácil e robusto com um analisador XML. Para substituir o conteúdo de uma
<header>
tag, você pode, por exemplo, usarPerguntas e respostas relacionadas à cotação:
Além disso, seu script não possui o caractere - inicial
#
na primeira linha, e você parece ignorar secd
altera com êxito o diretório de trabalho ou não (você realmente deseja definir o diretório de trabalho/usr/local/unimrcp/bin
a propósito?).O problema ocorreu devido ao processo não ter o TTY anexado a ele. TTY é o dispositivo usado pelo processo para interagir com a finalidade de entrada e saída. Como não havia TTY, o processo Unimrcp usou seu fd 1 (stdout) para uma das comunicações de thread (fd 1 foi anexado ao pipe do processo). Daí alguns caracteres inúteis foram enviados para o stdout (não sabe exatamente por quê?).
Após anexar o tty ao processo, o processo fd 1 apontou para /dev/pts/0 que é o pseudo terminal. Agora posso ver os logs em formato legível.
Adicionadas essas linhas ao arquivo yaml do pod. que resolveu o problema
containers: - name: unimrcp tty: true stdin: true