Как выйти из режима `tail -f` без использования` Ctrl + c`?

Некоторые команды GNU, такие как tar и rm, являются неэффективен при работе с большим классом файлов на Lustre . Например, для миллионов файлов команда rm -rf * может занять несколько дней и существенно повлиять на Lustre для других пользователей.
Причина кроется во времени, необходимом для раскрытия подстановочного знака.

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

Хороший способ просмотреть файлы перед их удалением - это следующее:

$ lfs find  -t f > rmlist.txt  
$ vi rmlist.txt  
$ sed -e 's:^:/bin/rm :' rmlist.txt > rmlist.sh  
$ sh rmlist.sh    

# the directory structure will remain, but unless there are many directories, we can simply delete it:  
$ rm -rf   

Некоторые из полезных ссылок для Lustre IO:
1. https://www.nics.tennessee.edu/computing-resources/file-systems/io-lustre-tips
2. https://www.rc.colorado.edu/support/examples-and-tutorials/parallel-io-on-janus-lustre.html

Спасибо!

22
22.08.2017, 12:52
5 ответов

Как сказано в комментариях, Ctrl -C не убивает процесс tail, что делается путем отправки либо сигнала SIGTERM, либо сигнала SIGKILL (печально известного -9.., ); он просто отправляет SIGINT, который сообщает tailо завершении прямого режима и выходе.

К вашему сведению, это лучший инструмент:

less +F filename

В lessвы можете нажать Ctrl -C , чтобы выйти из режима перемотки и прокрутить файл, затем нажать F , чтобы снова вернуться в режим перемотки.

Обратите внимание, чтоless +Fмногие пропагандируют как лучшую альтернативуtail -f. Чтобы узнать о различиях и предостережениях между двумя инструментами, прочитайте этот ответ:Является ли `хвост -f `более эффективным, чем `меньше +F `?

52
27.01.2020, 19:42

Это сработает и ответит на ваш вопрос, но не является особенно удовлетворительным решением.

timeout 15s tail -f /var/log/messages

Это запустит команду на 15 секунд, а затем уничтожит ее без необходимости нажимать^C

6
27.01.2020, 19:42

What I want is a normal way to quit, like q in top.

Это КонтрольС:)

I am just curious about the question, because I feel that killing the process is not a good way to quit something.

^C(ControlC)отправляет SIGINT процессу, который определен как:

The SIGINT signal is sent to a process by its controlling terminal when a user wishes to interrupt the process

Это именно то, что вы хотите здесь сделать, это прерывание tail. Нет другого способа выполнить то, что вы пытаетесь сделать ("хорошо" бросить хвост ), и хотя другие ответы позволяют остановить tailдругими способами, они ничем не лучше.

Нажатие ^Cпопытается прервать задачу в Linux --это совершенно нормально, и это только «нехорошо», если этот процесс находится в середине чего-то, и вы не даете ему завершиться, а затем единственный «нехороший» побочный эффект — это остатки этого процесса. Например, ^Cв середине команды makeоставляет частично -скомпилированное программное обеспечение, но это нормально :дальнейший запуск makeочистит/возобновит это с того места, где оно было остановлено.

16
27.01.2020, 19:42

Ответы различаются в зависимости от контекста. Чтобы выйти из tail -f элегантно, вам понадобится триггер. Предположим, вы пытаетесь отслеживать выходные данные задачи, которая завершится в какой-то момент времени -, что может стать вашим триггером.

task >& filename.log &
task_pid=$!
tail -f filename.log &
tail_pid=$!
while [ 1 ]
do
    # -0 is a special "poke" signal - "are you around?"
    kill -0 $task_pid
    if [ $? -eq 0 ]
    then
        # Original task is still alive.
        sleep 2
        continue
    fi
    kill -TERM $tail_pid
    break
done

Я использовал подобные идеи в прошлом.

Наслаждайтесь.

0
27.01.2020, 19:42

Выдача

echo tail -n 1 -f <filename>

работает для меня, хотя я не уверен на 100%, что он завершает хвостовой процесс.

-1
25.02.2020, 15:51

Теги

Похожие вопросы