@Interface

Как использовать один терминал, для нескольких процессов?

Дисклеймер: есть множество инструментов, которые частично решают мою проблему. Их список и чего именно мне не хватает будет ниже.

Контекст / Что я делаю:
Работаю над произвольным приложением. Для сборки и работы с которым необходимо запустить несколько процессов. Все они будут работать до тех пор, пока я вручную их не убью. Они могут писать в stdout с очень разной частотой. Чаще всего меня интересует, что пишет каждый из процессов и какой из них это делает. Такими процессами могут быть:
- локальный сервер статики
- несколько серверов приложения
- несколько сборщиков (webpack / gulp / typescript) для разных частей приложения
- утилита синхронизации
- линтеры
и т.д.

Что мне нужно:
- одна команда: чтобы все это запускалось одной командой (делается shell-скриптом)
- смешанный вывод: чтобы все процессы писали одну и ту же вкладку (подробнее ниже)
- маркировка процесса: вывод процесса должен как-то маркироваться, чтобы было понятно, что к чему относится
- throtling переключения: если 2 процесса будут одновременно поочередно писать, будет невозможно прочитать вывод ниодного из них
- вывод ресурсопотребления процесса: (опционально) было бы здорово, но в общем-то не обязательно видеть сколько ресурсов уходит на каждый процесс
- универсальность: (опционально) было бы здорово, если решение подходило (и хорошо вписывалось) для работы не только над веб-проектами (tmux vs. gulp), еще лучше если также было бы кроссплатформенным

Зачем нужно писать смешанно, чем не подходят panes из tmux:
Основная проблема с вкалдками в том, что процессы пишут с очень разной частотой. То есть, например:
- сборщик 1 пишет только при старте, а после, только при ошибках
- сервер приложения пишет каждую секунду
- другой сборщик пишет, на каждое изменение
Выводы каждого процесса нужно читать. Их можно расположить по вкладкам, но тогда вкладка со "сборщиком 1" будет стоять без дела (со старыми записями) все время,
в то время как она будет съедать существенное пространство на экране зря. С другой стороны активный процесс будет писать много текста, который будет сложно читать, в узкой вкладке.

Существующие решения
- app1 & app2 & app3 "амперсанд" можно использовать для запуска нескольких процессов в фоне, но:
- ✔️ (одна команда)
- ✔️ (смешанный вывод)
- ❌ (маркировка процесса): сложно определить какой процесс что выводит
- ❌ (throtling переключения): вместе с предыдущим пунктом, разобраться будет совсем сложно
- ❌ (вывод ресурсопотребления процесса)
- ✔️ (универсальность)

- tmux: (предполагаю что screen ведет себя также, но не уверен)
- ✔️ (одна команда)
- ❌ (смешанный вывод): я не нашел способа сделать комбинированный вывод для tmux, только несколько параллельных вкладок
- ✔️ (маркировка процесса): процессы легко разделить, но они в разных вкладках
- ➖ (throtling переключения): не актуально
- ✔️ (вывод ресурсопотребления процесса): есть плагины
- ✔️ (универсальность)

- docker-compose:
- ✔️ (одна команда)
- ✔️ (смешанный вывод)
- ✔️ (маркировка процесса)
- ❌ (throtling переключения)
- ❔ (вывод ресурсопотребления процесса)
❌ docker-compose делает что-то очень близкое тому, что мне надо, но я не могу его использовать только ради вывода в терминал

- webpack / gulp
- цели у него совсем другие и иногда его не хочется натягивать на глобус, а иногда это невозможно, плюс его будет странно использовать вне веб разработки

- самописное решение: я попробовал написать свою реализацию такой утилиты по смешиванию выводов процессов. В ней более ли менее решены требуемые вопросы, но все таки хочется какого-то готового, обкатоного решения.
- ✔️ (одна команда)
- ✔️ (смешанный вывод)
- ✔️ (маркировка процесса)
- ✔️ (throtling переключения)
- ✔️ (вывод ресурсопотребления процесса)
- ✔️ (универсальность)
❌ сырое, требует разработки, поддержки и опимизации

Используя свою реализацию, я записал то, как хочу видеть этот процесс: https://asciinema.org/a/6SS3oCqgCy3RY1XUXYMVovMao
в демке запускаются 2 прецсса, каждый из них пишет в консоль свой вывод (123 или hello) раз в секунду, но из-за throttling'а единовременно владеет выводом только один процесс в течении 5 секунд. По их истечении вывод отдается другому, который захватывает его на следующие 5 секунд и выводит все, что он писал "в черновик". Также реализован вывод ресурсов. Сделано это все (как можно заметить) на Node.js.

Возможно вы знаете инструменты, которые делают, что-то максимально похожее, но уже готовое?

Может вы знаете как научить tmux (или что-то другое) писать все в одну "комбинированную вкладку"?

Может быть это можно сделать, через грамотный конфиг для Gulp'a?

Или как называется такой тип вывода нескольких процессов, чтобы я знал что гуглить?
  • Вопрос задан
  • 973 просмотра
Решения вопроса 1
@Interface Автор вопроса
Наткнулся на вот этот npm модуль: https://github.com/kimmobrunfeldt/concurrently#readme в моем случае он достаточно хорошо решает то, что мне нужно
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@SANTA2112
Можешь попробовать pm2.keymetrics.io , он должен решать твои задачи, если что, он работает не только с нодой
Ответ написан
martin74ua
@martin74ua
Linux administrator
вы творчески описали систему управления сборкой, типа make. cmake и подобные. разберитесь с какой то, настройте под себя и пользуйтесь
Ответ написан
Interface линукс ?
https://github.com/tmux/tmux/wiki
Welcome to tmux!
tmux is a terminal multiplexe
или

screen
https://linuxize.com/post/how-to-use-linux-screen/
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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