Процесс Linux отправляет некоторые ненужные символы в STDOUT. К нему не подключен терминал управления

Для тех, кому это необходимо, существует ряд возможных рабочих -обходных путей. Некоторые из них могут не относиться к вашей ситуации.

  1. Подключиться через другой сеанс ssh и reboot, как предложил cas .
  2. Введите exit, чтобы выйти из chroot, и reboot, как предложил Кшиштоф Стасяк .
  3. Изнутри chroot, ssh localhostиreboot(аналогично #1 выше ).
  4. Проект servicectl на GitHub представляет собой «сценарий bash для запуска/остановки службы (демонов )для Linux с использованием systemd в chroot». (Systemd является причиной rebootсбоя. )Сам я этого не пробовал.
  5. Тип echo b |sudo tee /proc/sysrq-trigger. Используйте это в крайнем случае, так как я не уверен, что он сбросит файлы на диск.

0
02.01.2020, 14:24
2 ответа

Проблема возникла из-за того, что к процессу не был подключен телетайп. TTY — это устройство, используемое процессом для взаимодействия с целью ввода и вывода. Поскольку не было TTY, процесс Unimrcp использовал свой fd 1 (stdout )для связи с одним из потоков (fd 1 был присоединен к каналу процесса ). Следовательно, на стандартный вывод (были отправлены некоторые ненужные символы, точно не знаю, почему? ).

После присоединения tty к процессу процесс fd 1 указал на /dev/pts/0, который является псевдотерминалом. Теперь я могу видеть журналы в удобочитаемом формате.

Эти строки добавлены в файл yaml модуля. который решил проблему

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

0
28.01.2020, 02:38

Расширения переменных нужно заключать в двойные кавычки.

В команде

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.xmlбудут приняты как пути к файлам для обработки, а выражение seds+<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'аргументах ).

Вам также необходимо заключать расширения в двойные кавычки, когда вы используете их с echo.

Также обратите внимание, что синтаксический анализатор 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? ).

1
28.01.2020, 02:38

Теги

Похожие вопросы