Linuxプロセスがいくつかのガベージ文字をSTDOUTに送信しています。制御端子が接続されていません。

Linuxプロセスがいくつかのガベージ文字をSTDOUTに送信しています。制御端子が接続されていません。

kubernetes ポッドとして実行されるコンテナ化された unimrcp サーバーがあります。コンテナに入ってps -ef出力を実行すると、次のようになります。

[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

また、cat /proc/[pid]/fd/1これにより、次のように破損した出力が表示されます。

不明なコマンド:filer100000000000000000000000000000000000000000000000000000000000000000000000 FILE///////////////% FILE//////////////% FILE///////////////% FILE/ //////////////% FILE///////////////% FILE////////////%/%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

プロセスに制御端末が接続されていないのはなぜですか?標準出力の Unimrcp ロギングを無効にしました。 CPU使用率も99%に達しました。この問題を解決するのに役立つ人はいますか?

コンテナのエントリポイントです。

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

これは unimrcp コンテナの /proc/1/fd/ にある ls -l の出力です。

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]

ベストアンサー1

変数拡張には二重引用符が必要です。

指揮中

sed -i 's+<headers>.*</headers>+''<headers>'$LOG_HEADERS'</headers>+g' /usr/local/unimrcp/conf/logger.xml

変数拡張は$LOG_HEADERS引用されていません。つまりLOG_HEADERS、変数にスペースが含まれている場合は複数の単語に分割されます(そして各単語はファイル名のグロービングにもなります)。

つまり、$LOG_HEADERS文字列の場合A B Cはコマンドを受け取ります。

sed -i 's+<headers>.*</headers>+''<headers>'A B C'</headers>+g' /usr/local/unimrcp/conf/logger.xml

このコマンドでは、、、およびは処理するファイルのパス名として処理され、Bこれらのファイルに適用される式には構文エラーが含まれています。C</headers>+g/usr/local/unimrcp/conf/logger.xmlseds+<headers>.*</headers>+<headers>A

変数の拡張は常に二重引用符で囲みます。場合によっては、拡張に二重引用符は必要ありませんが、常に二重引用符を使用することを覚えやすくします。

あなたのコマンドは次のとおりです

sed -i 's+<headers>.*</headers>+''<headers>'"$LOG_HEADERS"'</headers>+g' /usr/local/unimrcp/conf/logger.xml

または

sed -i "s+<headers>.*</headers>+<headers>$LOG_HEADERS</headers>+g" /usr/local/unimrcp/conf/logger.xml

sed(実際には、各式を分離するか、別々;の引数として提供することで、単一の呼び出しで複数の-e 'expression'編集内容を簡単に囲むことができるので、コマンドは1つだけです。)

と一緒に使用する場合は、二重引用符の拡張も必要ですecho

また、XMLを解析することはたくさんXMLパーサーを使用する方が簡単で強力です。<header>たとえば、ラベルの内容を置き換えるには、次のようにします。

$ cat file.xml
<root>
<header>hello</header>
</root>
$ xmlstarlet ed -u '//header' -v "new data" file.xml
<?xml version="1.0"?>
<root>
  <header>new data</header>
</root>

引用に関する質問と回答:

それ以外にも、スクリプトの#最初の行に最初の文字がありませんが、作業ディレクトリを正常に変更したかどうかを無視しているようです(実際には、作業ディレクトリをそのディレクトリに設定したいcdですか?)。/usr/local/unimrcp/bin

おすすめ記事