我有一个容器化的unimrcp服务器,它作为kubernetes吊舱运行。当我进入容器并执行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]
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%。有人能帮我解决这个问题吗?
这是容器的入口点。
#!/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的输出。
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]发布于 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
发布于 2020-01-02 07:09:51
您需要加倍引用变量展开。
在命令中
sed -i 's+.*+'''$LOG_HEADERS'+g' /usr/local/unimrcp/conf/logger.xml变量展开$LOG_HEADERS未引用。这意味着,如果变量LOG_HEADERS包含空格,它将被分割为多个单词(并且每个单词还将经历文件名全局化)。
这意味着,如果$LOG_HEADERS是字符串A B C,则将得到以下命令
sed -i 's+.*+'''A B C'+g' /usr/local/unimrcp/conf/logger.xml在此命令中,B、C+g和/usr/local/unimrcp/conf/logger.xml将被视为要处理的文件的路径名,而要应用于这些文件的sed表达式s+.*+A包含语法错误。
始终重复引用任何变量展开。在有些情况下,不需要双重引用扩展,但是总是使用双引号要容易得多。
你的命令看起来像是
sed -i 's+.*+'''"$LOG_HEADERS"'+g' /usr/local/unimrcp/conf/logger.xml或
sed -i "s+.*+$LOG_HEADERS+g" /usr/local/unimrcp/conf/logger.xml(实际上,只有一个sed命令,因为您可以在一次调用中轻松地将几个编辑串在一起,方法是用;分隔每个表达式,或者在单独的-e 'expression'参数中给出它们)。
当您在echo中使用这些扩展时,还需要加倍引用它们。
还请注意,使用XML解析器解析XML要容易得多,而且更加健壮。要替换标记的内容,可以使用
$ cat file.xml
hello$ xmlstarlet ed -u '//header' -v "new data" file.xml
new data与引用有关的问答:
除此之外,您的脚本在第一行中缺少初始的#-character,并且您似乎忽略了cd是否成功地更改了工作目录(顺便说一下,您真的想将工作目录设置为/usr/local/unimrcp/bin吗?)
https://unix.stackexchange.com/questions/559890
复制相似问题