Прежде чем помечать вопрос как дубликат, прочитайте мои различные проблемы, с которыми я столкнулся.Чтение stdout из процесса (linux embedded)
Немного фона: мы разрабатываем приложение C++, работающее на встроенном ARM sbc, используя облегченный вариант debian linux. Приложение запускается при загрузке, запущенной скриптом загрузки, и печатает различную информацию в stdout. Нам хотелось бы подключиться с помощью SSH/Telnet и прочитать вывод приложения, не убивая процесс и перезагружая его для текущего сеанса bash. Я хочу создать простой скрипт .sh для тех, кто не пользуется технологией.
Первое решение для similar question, размещенное здесь, предназначено для использования gdb. Во-первых, он не является удобным для пользователя (нужно написать несколько команд вручную), и мне интересно, почему, но он, кажется, ничего не выводит в файл.
Второе решение strace -ewrite -p PID
работает отлично, вот что я хочу. Проблема в том, что есть намного больше информации, чем просто stdout, и это плохо отформатировано.
Мне удалось получить «приемлемый» результат с strace -e write=1 -s 1024 -p 20049 2>&1 | grep "write(1,"
, но он по-прежнему имеет излишний текст write(1, "...", 19) = 19
. До этого момента это просто немного форматирование строк, и я нашел на нескольких других страницах эту строку, говорящую, что он достиг хорошего форматирования: strace -ff -e write=1,2 -s 1024 -p PID 2>&1 | grep "^ |" | cut -c11-60 | sed -e 's/ //g' | xxd -r -p
В этой команде есть странные вещи (почему -ff ?, почему grep «^ |» ?, зачем использовать xxd?), и он просто ничего не выводит, когда я его пытаюсь.
К сожалению, мы используем старую багги-версию busybox (1.7.1), которая имеет некоторые проблемы с несколькими трубами. Эта ошибка дает мне плохие результаты. Например, если я только делаю grep, он работает, и если я только сокращаю его, это также работает, но, скажем, «grep» write (1, «| cut -c11-60» ничего не возвращает.
Я знаю реальный решение просто состояло бы в том, чтобы обновить busybox и использовать эти несколько каналов для форматирования строки, но мы не можем ее обновить, так как дистрибутив os уже установлен на тысячах плат, доставляемых нашим клиентам по всему миру.
У любого есть чудесные решение? Спасибо
Есть ли у вас «lite» Linux с программным «экраном» или вы можете создать для него экран? –
Экран нет, но, вероятно, можно легко построить. Похоже, что это может отлично работать, но мне не нравится тот факт, что в отличие от strace, экран должен быть родительским процессом вашего приложения и не может просто подключиться к уже запущенному. – Dunge