Как я могу прекратить следующий вывод меньше, не влияя на команду, генерирующую вывод?

12

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

node server.js | less

Когда я просто хочу посмотреть журнал, я нажимаю Shift+, Fчтобы добраться до конца файла и продолжаю смотреть журналы. Когда я хочу остановить это, я использую CTRL+ C.

К сожалению, это также останавливает сервер. Я просто хочу перестать смотреть конец журнала, не останавливая сервер.

Как это сделать?

Аджай Кумар
источник
1
Вы хотите выйти lessи вернуться к приглашению оболочки с nodeсервером, работающим в фоновом режиме, или вы просто хотите lessвернуться в нормальный режим без подписки, где вы можете просматривать журнал вместо просмотра последних строк?
Byte Commander
@ByteCommander, когда я нажимаю CTRL + C. я хочу, чтобы мой сервер продолжал работать, и я хочу вернуться к менее нормальному режиму без слежения, где я могу прокрутить.
Аджай Кумар

Ответы:

17

Я не могу найти способ выхода из Fрежима less, поэтому вам придется использовать обходной путь. Например, сохраните вывод в файл tmp, а затем просмотрите этот файл tmp:

node server.js > tmpfile & less tmpfile

Команда &заставляет node.jsкоманду работать в фоновом режиме. Это означает, что less tmpfileначнется немедленно и будет отслеживать tmpfile.

После входа lessвы можете нажать, Fчтобы войти в режим следования, но теперь Ctrl+ Cне убьет сервер, а только остановит следование. Теперь вы можете прокручивать, как хотите, и можете нажать, Fчтобы продолжить.

terdon
источник
13

Кажется, что вы обычно не должны выходить из режима «Вперед навсегда», как руководство man lessназывает режим, в который вы входите, нажимая Shift+ F.

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


Во всяком случае, вот фокус:

Я предполагаю, что вы запустили node server.js | lessalredy и нажали Shift+, Fчтобы войти в режим «Вперед навсегда». Теперь lessне реагирует ни на какие нажатия клавиш.

В этом состоянии вы можете нажать Ctrl+, Cчтобы убить процесс сервера, и lessзатем выйти из него, нажав Q(что, однако, по какой-то причине оставит команду как остановленный процесс в вашем списке заданий - вам нужно запустить ее, fgчтобы продолжить и полностью ее завершить). прекратить потом), но это не то, что мы хотим.

Вместо этого вы также можете нажать Ctrl+, Zчтобы остановить («заморозить») команду и вернуться в командную строку. Теперь быстро наберите команду shell fgf ore g round»), чтобы команда продолжала работать на переднем плане. Обратите внимание, что ваш nodeсерверный процесс также приостанавливается на это короткое время, вы должны решить, является ли это приемлемым или нет.

Так что теперь lessснова на переднем плане, как и раньше, верно? Да, но волшебным образом он больше не находится в режиме «Вперед навсегда». Вы можете снова использовать, например, клавиши со стрелками для прокрутки вверх и вниз.

К сожалению, lessпохоже, что он полностью перестал обновлять свой буфер, вы можете прокрутить вниз только до строки, в которой вы ранее заморозили команду, а не дальше. nodeСервер все еще работает и производит вывод , однако, мы просто должны получить , lessчтобы снова обновить.

Самый простой способ я нашел , чтобы сделать это, чтобы просто открыть less'помощи экрана и закройте его снова, нажав клавиши Hи Qпоследовательно. Теперь все, кажется, снова работает нормально.


Однако самое чистое решение, вероятно, состоит в том, чтобы следовать ответу Тердона и перенаправить вывод во временный файл, используя lessдля мониторинга файл.

Byte Commander
источник
Довольно блестящий грязный взлом.
TRiG
Я думаю, что предпочитаю этот ответ принятому. Обратите внимание, что вы можете запустить, %а не fg; Мне легче / быстрее набирать текст. Также кажется, что F(shift-f) все еще работает, даже не делая hqтрюк. Приятно! Теперь, когда я слежу за журналами, я могу ctrl-z % Enterсделать меньше, а затем вернуться к подписке, нажав F!
JoL
Кстати, вы не должны называть это грязным. Лично, это кажется чище , чем другие решения , как здесь, вы не должны засорять вашу файловую систему с временными файлами (для которых вы должны придумать название , а затем удалить), особенно , когда вы можете захотеть использовать less«s наблюдение функция в нескольких терминалах одновременно.
JoL
2
Я не искал в источнике, но это, вероятно, работает, потому что TSTPсигнал прерывает системный вызов чтения, который ожидал поступления новых данных; lessполучает 0 байтов и приходит к выводу, что вывод завершен. Чтобы не останавливать сервер, откройте новое окно терминала; выполнить psи идентифицировать идентификатор lessпроцесса; затем введите kill -TSTP <PID>; kill -CONT <PID>. Таким образом, сигналы должны доставляться спина к спине, без задержки, пока вы печатаете.
Alexis
@alexis, если вы собираетесь использовать kill, вы можете просто вместо этого отправить SIGINT. Тогда вам не нужно будет отправлять CONT, а lessпросто ждет вас.
Муру
3

Как ваш вопрос говорит:

Этот сервер регистрируется в терминале, а не в каком-либо файле.

Я предполагаю, что вы не хотите использовать (временный) файл журнала, возможно, ваш журнал огромен или по какой-либо причине у вас есть.


Именованный канал, fifoфайл.

Я придумал использовать named pipe fileтакже известный как fifoфайл, этот файл будет использоваться только для передачи ваших журналов к меньшему количеству, и на нем ничего не будет сохранено.

Сначала создайте fifo file:

mkfifo mylog

Запустите ваш сервер и перенаправьте журналы в этот файл:

node server.js > mylog &

Используйте меньше, чтобы читать ваши журналы (-f заставляет меньше читать этот специальный файл):

less -f mylog

Теперь вы можете использовать shift+, Fчтобы следовать, и CTRL+, Cчтобы остановить следование, но сервер все еще работает, вы можете следить за выводом снова с shift+ F.


План резервного копирования : Если он остановил ваш сервер, просто поместите вашу команду ( node server.js > mylog &) в файл, например:, server.shзатем вместо запуска node server.js > mylog &run: bash server.sh > mylog &и затем запустите less -f mylog.

Ravexina
источник
Какой смысл использовать fifo вместо обычного файла здесь? Единственное преимущество, которое я вижу, - это экономия дискового пространства, но я сомневаюсь, что это уместно для чего-то подобного. После этого у вас все еще будет файл, который вам придется удалить вручную.
Terdon
2
Я рекомендую против FIFO здесь, потому что процесс сервера может зависнуть, если буфер FIFO работает, когда никто не запрашивает (больше) данных журнала. Если размер файла журнала становится проблемой, нужно действительно использовать правильный файл журнала плюс logrotate.
Дэвид Фёрстер
@terdon Как вы сказали, единственное, что нужно - это сохранение диска, я думал, что ОП не хочет, чтобы его журналы сохранялись на диске.
Равексина
@DavidFoerster +1 Good Point;)
Равексина