Как автоматически завернуть вывод команды top

Вопрос или проблема

Когда я использую команду top в терминале Linux:

top -c

вывод выглядит так:

top - 21:54:17 up 197 days,  6:34,  1 user,  load average: 0.10, 0.65, 1.47
Tasks: 255 total,   1 running, 200 sleeping,   0 stopped,  54 zombie
%Cpu(s):  6.0 us,  4.5 sy,  0.0 ni, 87.4 id,  0.5 wa,  1.0 hi,  0.5 si,  0.0 st
MiB Mem :   3625.3 total,    119.0 free,   2408.5 used,   1097.9 buff/cache
MiB Swap:      0.0 total,      0.0 free,      0.0 used.    936.8 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
1398379 root      20   0 2498248  92148  20716 S   3.0   2.5   2055:04 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/k+
1403326 root      20   0 1892712 560052  27112 S   2.7  15.1   2502:04 kube-apiserver --advertise-address=172.31.227.20 --allow-privileged=true --authorization-mode=Node+
1428214 root      20   0 1402944 125200   9776 S   1.3   3.4 801:06.55 cilium-agent --config-dir=/tmp/cilium/config-map
3848379 root      20   0  269028  27268   7500 S   1.3   0.7 256:37.39 /usr/local/aegis/aegis_client/aegis_12_43/AliYunDunMonitor
 791206 root      20   0  125488  17484  11720 S   1.0   0.5   0:00.10 /usr/local/aegis/AliSecCheck/AliSecCheck -t rtap -c Rtap20483038711736690048
1399005

Я вижу часть содержимого команды, как автоматизированно перенести команду, когда она слишком длинная? Я пробовал:

[root@iZm5e2jhfbrshckqh6qdbuZ poemhub]# top -bcn1 -w100
top - 21:55:33 up 197 days,  6:35,  1 user,  load average: 0.47, 0.70, 1.42
Tasks: 252 total,   2 running, 196 sleeping,   0 stopped,  54 zombie
%Cpu(s):  5.9 us,  5.9 sy,  0.0 ni, 85.3 id,  0.0 wa,  2.9 hi,  0.0 si,  0.0 st
MiB Mem :   3625.3 total,    139.8 free,   2395.4 used,   1090.1 buff/cache
MiB Swap:      0.0 total,      0.0 free,      0.0 used.    949.4 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
 866186 root      20   0   22024   4932   3432 S   6.2   0.1   7:10.58 ./cv-render
1398379 root      20   0 2498248  89164  20720 S   6.2   2.4   2055:06 /usr/bin/kubelet --bootstra+
1404790 65532     20   0 1287016  21224      0 S   6.2   0.6 206:58.70 /coredns -conf /etc/coredns+
      1 root      20   0  387308   7460   3072 S   0.0   0.2   1324:21 /usr/lib/systemd/systemd --+
      2 root      20   0       0      0      0 S   0.0   0.0   0:04.12 [kthreadd]
      3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 [rcu_gp]
      4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 [rcu_par_gp]

Это просто скрывает вывод, а не переносит его, я все равно хочу видеть полный вывод. Я также пробовал так:

top -c -w 512|fold -w 120 -s

перенос работает, но команда не выводит полностью, просто использует + в конце команды.

Команда, которую вы ищете, это fold.

fold -w 80 -s

опция -s указывает делать перенос на пробелах.

опция -w задает позицию символа, на которой вставляется новая строка.

Это самое простое решение. … НО … top будет менять вывод, чтобы обрезать поле команды даже в режиме -b (batch).

звучит как задача программирования: просто напишите программу (на awk, perl, python, C++, Rust, Go, ALGOL, на чем угодно), которая будет копировать строки из входного потока в выходной до тех пор, пока (и включая момент, когда) не найдет строку, заканчивающуюся на COMMAND, где нужно запомнить столбец, в котором это начинается.

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

Звучит как интересное упражнение по программированию, которое вы определенно сможете выполнить, учитывая вашу историю вопросов!

У вас уже есть хорошие ответы, предлагающие опцию -w и переменную окружения COLUMNS. Существуют ситуации, когда использование -w с числовым аргументом менее желательно (например, когда вы не хотите, чтобы top -b отображал все процессы, а только топ n процессов), так что настройка COLUMNS может быть тем, что вам нужно.

Я описал одну из этих особенностей в этом ответе пару лет назад. Этот вопрос охватывал больше опций команды top, чем вы спрашиваете здесь, но кто знает? – эти дополнительные элементы могут вскоре быть вам полезны.

.

Ответ или решение

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

Теория (Theory)

Команда top служит для мониторинга процессов и отображения текущей загрузки системы. Однако, при работе с командами, имеющими длинные аргументы, вывод может становиться урезанным и не дает полной информации. Основная проблема заключается в том, что вывод ограничения колонок приводит к обрезке данных, что выражается в использовании символа "+" в конце строки.

Пример (Example)

Предположим, что вы запускаете команду:

top -c

и замечаете, что некоторые строки обрезаны, например:

/usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/k+

Применение (Application)

  1. Использование параметра -w:

    Один из способов решения проблемы — указать более широкий вывод с помощью параметра -w:

    top -c -w 512

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

  2. Использование переменной окружения COLUMNS:

    Вы также можете задать переменную окружения COLUMNS, чтобы установить количество символов в строке вывода:

    COLUMNS=120 top -b -c

    Это позволит top корректно адаптировать вывод под вашу конфигурацию терминала.

  3. Использование команды fold:

    Если вам необходимо произвести автоматический перенос строки, команда fold может стать полезной:

    top -b -c | fold -w 120 -s

    -w указывает количество символов до переноса строки, а -s осуществляет перенос по пробелам.

  4. Программирование для более сложных задач:

    Для решений, где необходимо контролировать каждую строку и переносить команду самостоятельно, можно написать собственную программу, например, на Python или Perl. Программа может читать строки до заголовка COMMAND, а затем обрабатывать каждую строку, чей размер превышает заданную ширину, вставляя переносы.

    Пример на Python может быть таким:

    import sys
    
    def wrap_lines(iterable, length=80):
       for line in iterable:
           while len(line) > length:
               wrap_at = line.rfind(' ', 0, length)
               print(line[:wrap_at])
               line = line[wrap_at+1:]
           print(line)
    
    if __name__ == '__main__':
       wrap_lines(sys.stdin, 100)

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

Оцените материал
Добавить комментарий

Капча загружается...