Меньше мешает меньше

2294
Ed McMan

Я часто перенаправляю вывод программы на меньшее, например

produce_output | less 

Это прекрасно работает, пока не произведет produce_outputбольшое количество продукции. Если я ищу какой-то текст, который находится глубоко в файле, меньше отчетов

Calculating line numbers... (interrupt to abort) 

Если я прерываю работу с Control + C, это также убивает produce_output, что останавливает его от дальнейшего вывода. Есть ли способ отправить прерывание на меньшее, чтобы оно produce_outputпродолжалось?

Я знаю, что мог бы использовать kill -INT less_process, но я думаю, что должно быть лучшее решение.

11

4 ответа на вопрос

13
grawity

Обычно все процессы в конвейере выполняются в одной и той же группе процессов, в результате чего все они получают сигнал. Вы можете использовать setsid foo | lessдля запуска fooв другой pgrp.

В свете проблемы, поднятой OP, кажется, что решение использовать CTRL + C как способ меньше прерывать очень неудачно. Знаете ли вы, почему этот конкретный сигнал был выбран? Будет ли какой-то другой сигнал менее проблематичным? Piotr Dobrogost 9 лет назад 0
@PiotrDobrogost: Какой еще сигнал вы бы предложили? Не многие имеют специальные сочетания клавиш, только SIGINT (Ctrl-C) и SIGQUIT (Ctrl - \\), и последний предназначен для немедленного выхода из программы, а не просто для прерывания. Остальные доступны только через `kill`. grawity 9 лет назад 0
Кажется, что проблема вызвана использованием сигнала для прерывания меньше. Вместо этого, если бы это была какая-то * нормальная * клавиша / ярлык, у нас не было бы проблемы с самого начала. Однако я полагаю, что необходимость в сигнале связана с тем, что процесс не может использовать `select` для одновременного ожидания ввода как из файла / канала, так и из терминала. Piotr Dobrogost 9 лет назад 0
@PiotrDobrogost: Может, так работает режим `F` (следовать). Трубы и т. П. Одинаково. grawity 9 лет назад 0
Как вы думаете, почему так работает режим следования? Я думаю, что поток событий заключается в том, что оболочка получает CTRL + C и отправляет сигнал SIGINT на меньший, который получает этот сигнал асинхронно без * прослушивания * клавиатуры / терминала. Piotr Dobrogost 9 лет назад 0
9
Matteo

Вы можете отключить номера строк с помощью

 -n or --line-numbers 

вариант.

produce_output | less -n 
-1: может решить подстрекательскую проблему ОП, но ничего не делает для ответа на фактический вопрос ОП (т. Е. Прерывание процесса). goldPseudo 12 лет назад 0
Извините, но начинать меньше с ненужной функции, а затем попытаться отправить сигнал на отключение функции, которую можно отключить с помощью переключателя, - это обходной путь, а не решение. Конечно, решение @grawity - это хорошо (и я проголосовал за него), но давай: запуск первого процесса в другой группе, чтобы иметь возможность отправить сигнал для прерывания задачи (подсчет строк), которая не нужна, на самом деле тоже немного много работы. Matteo 12 лет назад 2
Это справедливое решение проблемы, которую я поставил в своем вопросе. Однако прерывания останавливают больше, чем просто подсчет строк за меньшее время - например, они также прерывают длительный поиск. Таким образом, решение @ grawity является предпочтительным, поскольку оно будет охватывать любое использование прерываний в меньшем количестве. Мой плохой за то, что не обратился к этому более четко в вопросе! Ed McMan 12 лет назад 1
@EdMcMan Конечно, я также выбрал решение гравитации, и я счастлив узнать что-то новое, что всегда может быть полезным. Matteo 12 лет назад 0
0
jrennie

Работая с большими объемами вывода, я нашел очень полезным отправить вывод в файл и использовать tail -fили less +Fдля просмотра, например:

produce_output > out 2>&1 & less +F out 

2>&1Синтаксис убеждается, что и стандартный вывод и стандартный поток ошибок пойти out--- удалить, что если вы хотите только стандартный вывод собирается в файл. Таким образом, вы можете проверять вывод различными способами (даже с другой машины) без необходимости связываться с программой, производящей вывод.

Обратите внимание, что это 2>&1может быть связано с Bash (я не уверен). Убедитесь, что у вас достаточно места на диске для выходного файла :-)

Хвост просто покажет вам файл, Эд указал, что он использует меньше в интерактивном режиме (например, он должен искать в файле) Matteo 12 лет назад 0
`2> & 1` - это POSIX, голое`> & `- это башизм. grawity 12 лет назад 0
FWIW, 2> & 1 также работает в Windows XP, 7, 2008 и т. Д. jftuga 12 лет назад 0
@Matteo: да, я должен был использовать `less + F` в моем примере; Я только что обновил свой ответ. jrennie 12 лет назад 0
`less + F` не отключает подсчет строк, если файл огромен, это в любом случае займет время. И это также имеет ту же проблему, что и первоначально опубликовано: он не позволяет искать на лету, вы должны нажать Ctrl + C, чтобы сказать меньше, чтобы прекратить следовать за файлом (`Ожидание данных ... (прерывание, чтобы прервать)`) , Если вы хотите выполнить поиск, вы должны нажать Ctrl + C, выполнить поиск, а затем снова включить режим следования. Matteo 12 лет назад 0
@Matteo: подсчет строк - это не та же проблема с `less + F` (так как` less + F` обрабатывает данные по мере их генерации). Пример, который я привел, ** не ** имеет ту же проблему, что и первоначально опубликованный: Ctrl + C не будет прерывать `process_output`. Если кто-то не заботится о функциональности 'follow', он может запустить `yield_output> out 2> & 1`, затем` less out`. Проблема с `yield_output | less` состоит в том, что если что-то сломает канал (например, случайно нажмет 'q' из `less`), то" yield_output "умрет (без специальной обработки SIGPIPE). jrennie 12 лет назад 1
@jrennie Первоначальная проблема заключалась в том, что пользователь должен был прервать подсчет строк, так как это было не нужно, и поиск замедлялся (пользователю пришлось ждать). `less + F` также будет считать строки и, в соответствии с инструкцией, будет также выполнять несколько операций медленнее. Использование `less out`, как в вашем последнем комментарии, решит проблему` control-C`, но зачем начинать с подсчета строк, а затем прерывать его? Вы можете просто начать меньше без подсчета строк, и все готово. Matteo 12 лет назад 0
0
Eric Woodruff

Вы также можете просто сделать это:

less +F -f <(produce_output)