Як обмежити кількість рядків, наявних у команді у базі?


11

Я почав завантажувати великий файл у фоновому режимі за допомогою

$ nohup wget http://example.tld/big.iso &

який також дає мені nohup.outфайл, що включає вихід wget.

Тепер, якщо я потім хочу спостерігати за процесом завантаження, я міг би використовувати , $ tail -f nohup.outале це наповнює моє вікно терміналу швидше , ніж я бажаю. Що я хотів би бачити, це останній рядок, який постійно оновлюється (як і коли використовується wgetсам).

Я намагався, $ tail -n 1 -f nohup.outале, здається, впливає лише на початковий хід.

Взагалі кажучи, якщо можливо обмежити (в даному випадку 1) кількість рядків, які виведення команди є доступними / видимими, це вирішило б цю проблему. Начебто вихід у круговому буфері - просто подумайте про те, $ wget example.tld/big.isoяк надрукується звичайний рядок ходу .

Чи є таке рішення?

Або я неправильно лізу на дерево? (Значить, чи буде простіше обмежити nohupвихід чи зробити щось інше?)

Відповіді:


10

Якщо ви не хочете обмежувати область прокрутки (див. Іншу мою відповідь), ви також можете скористатися поверненням каретки, щоб повернутися до початку рядка перед друком наступного рядка. Існує послідовність відходу, яка очищає решту рядка, яка необхідна, коли поточна лінія коротша за попередню.

nohup wget http://cdimage.debian.org/debian-cd/6.0.3/amd64/iso-dvd/debian-6.0.3-amd64-DVD-1.iso &
el="$(tput el)"; # Clear to the end of the line
tail -n 1 -f nohup.out | while read -r line; do echo -n $'\r'"$el$line"; done;

6

Ви можете використовувати watchтут:

watch -n 0.5 -e "tail -n 1 nohup.out"

Редагувати : Тут виглядає варіант -e(псевдонім --exec). Особливо, якщо ви націлені на біг watchз дуже невеликими інтервалами, це зменшує накладні витрати, спричинені sh -cвнутрішнім бігом watchкожного циклу.


2
Зауважте, що це породжує новий tailпроцес щосекунди, який може бути, а може і не бути чимось важливим. Крім того, обов'язково вкажіть інтервал під секунду (наприклад watch -n 0.1), щоб імітувати частину "постійно оновлюється". (Це, очевидно, збільшує кількість процесів і також відкриває виклики файлів.) Нарешті, якщо ви використовуєте OS X, ви можете отримати watchз MacPorts, оскільки вона за замовчуванням недоступна.
janmoesen

Це трохи обхідно, але чудово як таке. Я очікував на неекранну відповідь, щоб побачити попередні виходи - але насправді я міг би використовувати watchв новому вікні терміналу. Я також виявив, що використання tail -n 2є більш корисним , ніж -n 1з wget, по крайней мере , з watchінтервалом в 1 секунду, так як в противному випадку останній відсоток не може розглядатися; це не вада у вашій відповіді, але я згадував про це, якщо хтось інший вирішив дивитись wgets, підвішений на вихід.
Ярі Кейненен

@janmoesen Для цього специфічного сценарію, tailмабуть, новий процес, мабуть, не надто зайвий; але як загальну відповідь це добре враховувати. Я також зазначив, що watch -n 0.1не працювало, але watch -n 0,1працювало - можуть бути застосовані локалі, хоча я раніше не бачив локалів, застосованих до параметрів команд терміналу. Як зауваження: brew install watchтакож добре працював :-)
Jari Keinänen

Побічна примітка: чи watchбуде працювати з вами локальних налаштувань 0,1чи 0.1залежить від них (він використовує десятковий символ, визначений для вашої мови). Перевірити LC_ALL=C watch -n 0.1 "date +%S.%N".
rozcietrzewiacz

3

Існують певні послідовності керування Xterm, якими ви можете скористатись для обмеження ліній вашого терміналу, які прокручуються. Шукайте "Встановити область прокрутки". Це хоч трохи хитрощі. Не забудьте скинути термінал після цього:

nohup wget http://cdimage.debian.org/debian-cd/6.0.3/amd64/iso-dvd/debian-6.0.3-amd64-DVD-1.iso &
clear; echo -n $'\e[1;2r'; tail -f nohup.out | grep --line-buffered .
# The "grep" line is to ensure a single line; you can also use "awk 1" or "sed" etc.

<Вставте тут звичайну примітку про
непереносимість

Це ще одна чудова альтернатива, але та, яка також найкраще використовується у виділеному вікні, оскільки tail -fвсе ще заповнює буфер, а також тому, що термінал після цього потрібно скинути. Це не так рядний , як я сподівався, але в іншому випадку це може бути те , що я шукав.
Jari Keinänen

0

Якщо ви не хочете, щоб вихід займав усе поточне вікно терміналу, ви можете використовувати простий whileцикл:

while true; do 
  XXX=$( tail -n1 my.log )
  echo -en " \r$XXX\r"
  sleep 0.5
done; echo

1
Зауважте, що для того, щоб мати змогу прокручувати вихід терміналу під час виконання будь -якої команди, що виробляє вихід, вам потрібно відредагувати налаштування емулятора термінала та відключити scrollTtyOutput(або подібний) варіант.
rozcietrzewiacz
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.