Как можно настроить вывод команды top или аналогичных утилит в Linux?

У меня часто запускается множество сборок, в процессе которых параллельно выполняются около 50 процессов типа gcc. Я хотел бы видеть в каждой строке вывода утилиты top (или аналогичной), какой файл компилируется. По умолчанию top отображает только имя программы, например, gcc, в колонке COMMAND. 

Мне нужно, чтобы top показывал в строках, где присутствует gcc, информацию в формате "gcc имя-компилируемого файла" или "gcc имя-выходного .o файла". При этом показывать все аргументы gcc нерационально, так как они могут включать десятки опций, и в сумме всё это может превышать 1000 символов. Важно, чтобы top выводил только имя программы (gcc) и названия обрабатываемых файлов (.c или .o).
  • 27 августа 2024 г. 10:04
Ответы на вопрос 2
Чтобы добиться желаемого вывода в утилите `top`, вы можете использовать несколько подходов. Посмотрим парочку возможных решений.

### 1. Использование `htop`

`htop` — это более мощная и гибкая альтернатива утилите `top`. Она позволяет настраивать вывод и имеет возможность отображать более специфическую информацию.

Чтобы установить `htop`, используйте пакетный менеджер вашей системы:

- На Debian/Ubuntu:
  ```bash
  sudo apt install htop
  ```

- На CentOS/RHEL:
  ```bash
  sudo yum install htop
  ```

- На Fedora:
  ```bash
  sudo dnf install htop
  ```

После установки запустите `htop`:

```bash
htop
```

В `htop` вы можете настроить колонки, нажав `F2` (настройки), затем выберите `Columns`, и добавьте `COMMAND`. Однако `htop` не позволяет фильтровать команды напрямую, как это требуется в вашем случае.

### 2. Использование `ps` с фильтрацией

Так как `top` и `htop` не позволяют непосредственно изменять вывод команд, можно использовать комбинацию команды `ps` и `grep` для фильтрации процессов на лету.

Пример команды, которая покажет все процессы `gcc` и соответствующие файлы:

```bash
ps -eo pid,comm,args | grep 'gcc'
```

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

```bash
ps -eo pid,comm,args | grep 'gcc' | awk '{print $1, $2, $(NF)}'
```

### 3. Использование `watch`

Если вам нужно перманентно отслеживать `gcc` процессы, вы можете использовать `watch` вместе с командой `ps`:

```bash
watch "ps -eo pid,comm,args | grep 'gcc' | awk '{print \$1, \$2, \$(NF)}'"
```

### 4. Создание обертки для `gcc`

Если вы хотите, чтобы вы видели файл, который компилируется напрямую в `top`, можно создать обертку для `gcc`, которая будет добавлять дополнительную информацию в командной строке.

Создайте скрипт `gcc_wrapper.sh`:

```bash
#!/bin/bash
./gcc "$@" | sed -n 's/.* -o \([^.]*\)\..*/gcc \1.o/p'
exec /usr/bin/gcc "$@"
```

Не забудьте сделать скрипт исполняемым:

```bash
chmod +x gcc_wrapper.sh
```

Теперь используйте `gcc_wrapper.sh` вместо `gcc` в ваших сборках. 

### Заключение

Хотя утилита `top` не позволяет непосредственно модифицировать вывод под ваши нужды, вы можете использовать `ps` и `grep` для достижения цели. Также рассмотрите возможность использования `htop` для удобного мониторинга процессов с более гибкими настройками.
Берёте список процессов (например, ps auxww ), грепаете его и оставляете только нужные вам поля.
Похожие вопросы