Як я можу зупинити наступний вихід менше, не впливаючи на команду, що генерує вихід?


12

Я запускаю сервер, і журнал цього сервера потрапляє в термінал, а не в жоден файл. Мені хотілося б менше використовувати для перегляду цього журналу.

node server.js | less

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

На жаль, це зупиняє і сервер. Я просто хочу перестати дивитися кінець журналу, не зупиняючи сервер.

Як це зробити?


1
Ви хочете вийти lessта повернутися до підказки для оболонки із nodeзапущеним у фоновому режимі сервером, чи ви просто хочете lessповернутися в звичайний не наступний режим, де ви можете прокручувати журнал замість перегляду останніх рядків?
Байт-командир

@ByteCommander, коли я натискаю CTRL + C. Я хочу, щоб мій сервер продовжував працювати, і я хочу повернутися в менш нормальний не наступний режим, де я можу прокручувати.
Аджай Кумар

Відповіді:


17

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

node server.js > tmpfile & less tmpfile

Команда &робить node.jsкоманду виконувати у фоновому режимі. Це означає, що less tmpfileпочнеться негайно і буде відстежувати tmpfile.

Після цього lessви можете натиснути, Fщоб увійти в режим слідування, але тепер Ctrl+ Cне вбиває сервер, це лише зупинить наступне. Тепер ви можете прокручувати, як хочете, і натисніть, Fщоб відновити наступне.


13

Здається, що ви, як правило, не повинні виходити з режиму "Вперед вперед", саме так, як керівництво man lessназиває режим, який ви вводите, натискаючи Shift+ F.

Однак я знайшов невеликий брудний трюк, як можна в будь-якому випадку повернутися до норми. Це ненадовго заморозить команду, тому я не впевнений, чи підходить вона для вашого сервера, який, ймовірно, повинен працювати безперебійно.


У всякому разі, ось фокус:

Я припускаю, що ви почали node server.js | lessalredy і натиснули Shift+, Fщоб увійти в режим "Наперед вперед". Тепер lessвже не реагує на жодне натискання клавіш.

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

Натомість ви також можете натиснути Ctrl+, Zщоб зупинити ("заморозити") команду та повернутися до підказки. Тепер швидко введіть команду оболонки fg(" f ore g round"), щоб команда продовжувала працювати на передньому плані. Зауважте, що ваш nodeсерверний процес також призупинено протягом цього короткого часу, ви повинні врахувати, прийнятний це чи ні.

Тож тепер lessзнову працює на передньому плані, як і раніше, правда? Так, але магічно він більше не перебуває в режимі "Вперед вперед". Наприклад, можна знову використовувати клавіші зі стрілками для прокручування вгору та вниз.

На жаль, lessсхоже, що повністю зупинив оновлення буфера повністю, ви можете лише прокрутити вниз до рядка, на якому ви заморозили команду раніше, а не далі. nodeСервер все ще працює і виробляє висновок , однак, ми просто повинні отримати , lessщоб знову відновити.

Найпростіший спосіб, який я знайшов, це просто відкрити lessдовідковий екран та закрити його знову, натискаючи клавіші Hта Qпослідовно. Зараз, здається, все знову працює нормально.


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


Досить блискучий брудний злом.
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

Як говорить ваше запитання:

Цей сервер потрапляє в термінал, а не в жоден файл.

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


Названа труба, 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.


Який сенс тут використовувати фіфо, а не звичайний файл? Єдина перевага, яку я бачу, - це економія на диску на диску, але я сумніваюся, що це буде актуально для чогось подібного. Після закінчення роботи у вас залишиться файл, який доведеться видалити вручну.
тердон

2
Тут я рекомендую проти FIFO, оскільки серверний процес може зупинитися, якщо буфер FIFO запускається повноцінно, коли ніхто не запитує (більше) даних журналу. Якщо розмір файлу журналу стає проблемою, дійсно слід використовувати належний файл журналу плюс logrotate.
Девід Фоерстер

@terdon Як ви сказали, єдиним моментом є збереження диска, я думав, що ОП не хоче, щоб його журнали були збережені на диску.
Ravexina

@DavidFoerster +1 Good Point;)
Равексіна
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.