首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux进程正在向STDOUT发送一些垃圾字符。没有连接控制终端。

Linux进程正在向STDOUT发送一些垃圾字符。没有连接控制终端。
EN

Unix & Linux用户
提问于 2020-01-02 06:55:13
回答 2查看 255关注 0票数 0

我有一个容器化的unimrcp服务器,它作为kubernetes吊舱运行。当我进入容器并执行ps -ef时,其输出如下所示:

代码语言:javascript
复制
[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] 
root        76     1  0 13:13 ?        00:00:00 [arping] 
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,那么我会看到一些损坏的输出,如下所示:

未知命令:▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒

为什么没有与过程连接的控制终端。我已经将Unimrcp从登录禁用到stdout。CPU利用率为99%。有人能帮我解决这个问题吗?

这是容器的入口点。

代码语言:javascript
复制
#!/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+.*+'''$LOG_LEVEL'+g' 
/usr/local/unimrcp/conf/logger.xml
sed -i 's+.*+'''$LOG_OUTPUT'+g' 
/usr/local/unimrcp/conf/logger.xml
sed -i 's+.*+'''$LOG_HEADERS'+g' 
/usr/local/unimrcp/conf/logger.xml
sed -i 's++'''$CONTROL_IP'+g' 
/usr/local/unimrcp/conf/unimrcpserver.xml
sed -i 's++'''$MEDIA_IP'+g' 
/usr/local/unimrcp/conf/unimrcpserver.xml 
cd /usr/local/unimrcp/bin/
exec ./unimrcpserver

这是unimrcp容器内/proc/1/fd/的ls -l的输出。

代码语言:javascript
复制
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]
EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2020-01-07 07:17:01

问题是因为进程没有附在TTY上。TTY是进程为输入和输出目的进行交互的设备。由于没有TTY,Unimrcp进程使用其fd 1 (stdout)作为线程通信之一(fd 1附在进程的管道上)。因此,有一些垃圾字符被发送到stdout (不知道确切原因?)

在将tty附加到进程后,进程fd 1指向/dev/pt/0,这是伪终端。现在,我能够以可读的格式看到日志。

将这些行添加到pod yaml文件中。解决了这个问题

containers: - name: unimrcp tty: true stdin: true

票数 0
EN

Unix & Linux用户

发布于 2020-01-02 07:09:51

您需要加倍引用变量展开。

在命令中

代码语言:javascript
复制
sed -i 's+.*+'''$LOG_HEADERS'+g' /usr/local/unimrcp/conf/logger.xml

变量展开$LOG_HEADERS未引用。这意味着,如果变量LOG_HEADERS包含空格,它将被分割为多个单词(并且每个单词还将经历文件名全局化)。

这意味着,如果$LOG_HEADERS是字符串A B C,则将得到以下命令

代码语言:javascript
复制
sed -i 's+.*+'''A B C'+g' /usr/local/unimrcp/conf/logger.xml

在此命令中,BC+g/usr/local/unimrcp/conf/logger.xml将被视为要处理的文件的路径名,而要应用于这些文件的sed表达式s+.*+A包含语法错误。

始终重复引用任何变量展开。在有些情况下,不需要双重引用扩展,但是总是使用双引号要容易得多。

你的命令看起来像是

代码语言:javascript
复制
sed -i 's+.*+'''"$LOG_HEADERS"'+g' /usr/local/unimrcp/conf/logger.xml

代码语言:javascript
复制
sed -i "s+.*+$LOG_HEADERS+g" /usr/local/unimrcp/conf/logger.xml

(实际上,只有一个sed命令,因为您可以在一次调用中轻松地将几个编辑串在一起,方法是用;分隔每个表达式,或者在单独的-e 'expression'参数中给出它们)。

当您在echo中使用这些扩展时,还需要加倍引用它们。

还请注意,使用XML解析器解析XML要容易得多,而且更加健壮。要替换标记的内容,可以使用

代码语言:javascript
复制
$ cat file.xml

hello
代码语言:javascript
复制
$ xmlstarlet ed -u '//header' -v "new data" file.xml


  new data

与引用有关的问答:

除此之外,您的脚本在第一行中缺少初始的#-character,并且您似乎忽略了cd是否成功地更改了工作目录(顺便说一下,您真的想将工作目录设置为/usr/local/unimrcp/bin吗?)

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/559890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档