Как я могу запустить команду в фоновом режиме и одновременно записывать вывод?

Вопрос или проблема

Я хочу запустить команду в фоновом режиме, но одновременно хочу видеть вывод, чтобы убедиться, что она работает корректно.

Я использую это, чтобы выполнить некоторые действия с помощью wp-cli и сохранить вывод.

Если я вас правильно понял, вы хотите “сохранить вывод в текстовый файл” и “хочу видеть вывод”, тогда ответ здесь поможет.

“Команда tee копирует стандартный ввод в стандартный вывод и также в любые файлы, указанные в качестве аргументов. Это полезно, когда вы хотите не только отправить данные по каналу, но и сохранить их копию.”

Вы также можете прочитать больше здесь:
https://www.gnu.org/software/coreutils/manual/html_node/tee-invocation.html

Для использования простого примера gustafbstrom:
program [arguments...] 2>&1 | tee outfile

Таким образом, вы можете видеть вывод вашей команды на экране и одновременно сохранять его в файл.

Вы смешиваете два вопроса: “работа в фоновом режиме” и “я хочу видеть вывод”.

Вам нужно отступить назад и больше подумать о проблеме. Что вы действительно хотите?

Из того, что я понял, вы действительно хотите “работать в фоновом режиме”.

Вы можете достичь обеих целей, но одна из них должна иметь приоритет и быть основной. Решение другой будет зависеть от этого.

Поскольку “видеть вывод программы” является довольно тривиальной задачей, не важно, каким способом вы её решите, смотрите другие ответы, говорящие о tee и перенаправлениях.

Как я уже сказал, я предлагаю вам сначала сосредоточиться на “фоновом режиме”.

Первая истина: вам нужно понять, что в Unix нет “фона”!

Существует концепция демонов. А затем есть хак “демонизации”, но ни один из этих терминов не означает “фон”.

Концепция демонов сохраняется даже сегодня, но концепция “демонизации” больше не актуальна! Сегодня (т.е. 2022) у нас есть все инструменты, чтобы выбросить неразумную “демонизацию” в окно.

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

Демон, с другой стороны, – это просто процесс, который не обрабатывает только ввод-вывод одного пользователя и не ограничивается одной сессией пользователя и временем (конечный) ограниченным временным отрезком. Демон просто работает бесконечно, и часто (но не всегда) обрабатывает ввод-вывод нескольких пользователей и не привязан к какой-либо сессии пользователя. Но “предний”/”фоновый” больше не имеет значения.

Итак, вернемся к исходному заявлению: в Unix нет “фона”, есть только две возможности: либо выводы и входы процесса подключены к текущему (вашему) терминалу, либо они подключены к чему-то другому.

Процессы, которые подключены к вашему текущему терминалу (т.е. “предний” – но имейте в виду, что это только ваш предний, у Бена другой предний, и у Кейси тоже другой), естественно, будут завершены, когда этот терминал отключится. Таким образом, все, что не подключено к отключаемому терминалу, работает в “фоновом режиме”.

Я надеюсь, что вы поняли суть и не запутались. Если нет, перечитайте предыдущий абзац, пока не поймете.

Таким образом, для “фоновости” вам просто нужно убедиться, что ваше запущенное wp-cli не подключено к какому-либо эфемерному терминалу.

Терминалы эмуляторов терминалов, VT-терминалы для входа и SSH-терминалы для входа являются эфемерными, т.е. они отключаемы. Итак, все, что вам нужно сделать, это “привязать” ваш wp-cli к какому-то неэфемерному терминалу, т.е. тому, который не будет отключен автоматически. Самые простые, которые можно запустить, – это tmux и screen.

Итак, вы входите на свой сервер, начинаете новую сессию tmux и запускаете wp-cli оттуда. Если ваша SSH-сессия получает сбой (проблема с сетью), ваш wp-cli все равно будет работать, потому что он подключен к “внутреннему” терминалу tmux, а не к терминалу SSH (он был разрушен, когда сеть вышла из строя). Таким образом, вы эффективно достигли “фоновости”.

Теперь, если вы не хотите архивировать вывод, вам не нужно ничего больше, так как у tmux есть функция прокрутки, так что вы можете прокручивать назад (шуточно) через все строки, которые сгенерировал wp-cli (конечно, tmux ограничивает количество записанных строк).

Если вы действительно хотите архивировать вывод, просто выполните wp-cli | tee wp-cli.log изнутри сессии tmux, и теперь вы можете “смотреть и записывать” вывод одновременно.

screen аналогичен tmux, но старее и менее разумен, поэтому я предлагаю вам обратить внимание на tmux. С другой стороны, screen (в различных стадиях поломки) присутствует на большем количестве систем. Выбор за вами.

tmux – отличная “платформа” для запуска долгосрочных временных задач в “фоновом режиме”, именно так, как вы и спрашиваете.

К сожалению, иногда, так как tmux является настолько временным/ручным (например, каждый раз, когда сервер перезапускается, вам нужно заново настраивать сессию tmux и запускать команду там), вы хотите преобразовать свой скрипт в “демон”, но это выходит за рамки этой статьи.

Ответ или решение

Чтобы выполнить команду в фоновом режиме и одновременно вести лог ее вывода, есть несколько простых и эффективных методов. В данном контексте, когда речь идет о работе с инструментом командной строки wp-cli, вы можете использовать такие инструменты, как tee и сессии tmux или screen. Рассмотрим эту проблему более детально.

Шаг 1: Использование команды tee

Команда tee позволяет дублировать стандартный вывод (stdout) и отправлять его как в файл, так и в терминал, что решает две проблемы одновременно: вы видите вывод на экране и сохраняете его в файл для дальнейшего анализа. Пример команды выглядит так:

wp-cli ваши_аргументы 2>&1 | tee output.log &

Пояснение:

  • wp-cli ваши_аргументы — ваша команда.
  • 2>&1 — объединяет стандартный вывод (stdout) и вывод ошибок (stderr), чтобы вы могли видеть все сообщения.
  • | tee output.log — передает вывод команды в tee, которая сохраняет его в файл output.log и одновременно выводит на экран.
  • & в конце команды указывает на то, что команда будет выполняться в фоновом режиме.

Шаг 2: Использование менеджера окон tmux или screen

Если ваша задача длительная и вы хотите гарантировать, что процесс будет продолжать выполняться даже после завершения SSH-сеанса, используйте tmux или screen. Эти утилиты позволяют создать виртуальную сессию, которая продолжает работать независимо от вашего терминала.

  1. Запустите tmux:

    tmux new -s mysession
  2. Выполните вашу команду:

    wp-cli ваши_аргументы | tee output.log
  3. Отсоединитесь от сессии tmux, не завершая процессы, нажимая Ctrl+b, а затем d.

  4. Для повторного подключения к сессии выполните:

    tmux attach -t mysession

Шаг 3: некоторые дополнительные рекомендации

  • Убедитесь, что у вас установлен tmux или screen. В большинстве современных дистрибутивов Linux он уже включен, но при необходимости его можно установить с помощью пакетного менеджера вашей системы.
  • Если ваши команды требуют множественных шагов, дополнительно рассмотрите создание скрипта для автоматизации процесса, чтобы просто запускать его при необходимости, сохраняя при этом вывод.

Заключение

Использовав описанные выше методы, вы сможете эффективно выполнять команды в фоновом режиме, одновременно отслеживая их вывод. Это особенно полезно при использовании инструментов, таких как wp-cli, для выполнения долгих процессов без риска их прерывания. Выбор между tee и сессиями tmux/screen будет зависеть от конкретных потребностей и условий вашей работы.

Оцените материал
Добавить комментарий

Капча загружается...