Прежде чем отмечать вопрос как повторяющийся, пожалуйста, прочтите мои различные проблемы, с которыми я столкнулся.
Немного предыстории: мы разрабатываем приложение на C ++, работающее на встроенном ARM sbc, с использованием облегченного варианта debian linux. Приложение запускается при загрузке, запускаемом загрузочным скриптом, и выводит различную информацию на стандартный вывод. Мы хотели бы иметь возможность подключаться с помощью SSH / Telnet и читать выходные данные приложения без необходимости останавливать процесс и перезапускать его для текущего сеанса bash. Я хочу создать простой сценарий .sh для людей, не разбирающихся в технологиях.
Первое решение для аналогичных вопрос, размещенный здесь, заключается в использовании gdb. Во-первых, это неудобно (нужно писать несколько команд вручную), и мне интересно, почему, но, похоже, он ничего не выводит в файл.
Второе решение strace -ewrite -p PID
работает отлично, вот чего я хочу. Проблема в том, что информации намного больше, чем просто стандартный вывод, и она плохо отформатирована.
Мне удалось получить "приемлемый" результат с 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 и использовать эти несколько каналов для форматирования строки, но мы не можем обновить его, поскольку дистрибутив ОС уже установлен на тысячах плат, отправленных нашим клиентам по всему миру.
У кого-нибудь есть чудесное решение? Спасибо