Вопрос или проблема
Когда я использую команду 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)
-
Использование параметра
-w
:Один из способов решения проблемы — указать более широкий вывод с помощью параметра
-w
:top -c -w 512
Этот метод увеличивает количество символов в строке, однако, если ширина вашего терминала меньше, чем указанная ширина вывода, это может не сработать.
-
Использование переменной окружения
COLUMNS
:Вы также можете задать переменную окружения
COLUMNS
, чтобы установить количество символов в строке вывода:COLUMNS=120 top -b -c
Это позволит
top
корректно адаптировать вывод под вашу конфигурацию терминала. -
Использование команды
fold
:Если вам необходимо произвести автоматический перенос строки, команда
fold
может стать полезной:top -b -c | fold -w 120 -s
-w
указывает количество символов до переноса строки, а-s
осуществляет перенос по пробелам. -
Программирование для более сложных задач:
Для решений, где необходимо контролировать каждую строку и переносить команду самостоятельно, можно написать собственную программу, например, на 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)
Профессиональное решение заключается в выборе подхода, который наилучшим образом соответствует вашим операционным потребностям и позволяет получить наглядный и полный вывод без потерь информации.