Найти тему
Nuances of programming

5 эффективных Unix-команд для устранения неполадок

Оглавление

Источник: Nuances of Programming

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

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

Команда lsof

lsof означает “список открытых файлов” и безусловно относится к числу самых эффективных команд диагностики и устранения неполадок благодаря большому объему предоставляемой информации.

Вывод открытых файлов, принадлежащих активным процессам

В отсутствии каких-либо аргументов lsof перечисляет открытые файлы, принадлежащие всем активным процессам. Эта команда может пригодиться для обнаружения процесса, использующего файл, который вы намерены удалить.

Вводим lsof в терминал, чтобы проверить ее в действии:

$ lsof

Пример вывода:

lsof 22221 root mem REG 8,21 163200 3416251 /usr/lib/x86_64-linux-gnu/libselinux.so.1
lsof 22221 root mem REG 8,21 27002 3946603 /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache

В рамках другой ситуации может возникнуть необходимость изучить какой-нибудь сомнительный процесс. Тогда lsof поможет проверить его файлы для получения дополнительной информации.

При этом в отношении некоторых процессов вы получите сообщение Permission denied , т.е. “доступ запрещен”, поскольку у вашего пользователя нет разрешения на просмотр процессов, принадлежащих другим. В таком случае выручит команда root , открывающая обзор процессов всех пользователей.

Список файлов, открытых пользователем

Следующая команда помогает определить, какие файлы применяются конкретным пользователем:

$ lsof -u someuser

Большое количество открытых файлов несомненно вас удивит. Для ограничения числа получаемых результатов воспользуйтесь командой grep .

Для демонстрации действия этой команды в фоновом режиме было запущено приложение Java.

$ lsof -u kirshi | grep java

Извлечение вывода:

java 21990 kirshi 60u IPv6 427746 0t0 TCP localhost:59486->localhost:37209 (ESTABLISHED)
java 21990 kirshi 61r REG 8,21 53615 4204556 /usr/share/java/java-atk-wrapper.jar

Завершение всех процессов пользователя

Для завершения всех процессов пользователя существует следующая команда:

kill -9 `lsof -t -u someuser`

Вывод процессов , использующих конкретный порт

При необходимости вывести список всех запущенных на конкретном порту процессов, выполните следующую команду:

lsof -i :8090

Пример вывода:

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 21990 kirshi 67u IPv6 427760 0t0 TCP *:8090 (LISTEN)

Обратите внимание, что аргумент -i выводит все прослушиваемые и установленные соединения.

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

$ lsof -i :8090-9090

Обнаружить процесс также можно с помощью PID:

lsof -p 23619

Результат будет включать все процессы, принадлежащие 23619 PID.

Команда netstat

netstat  —  превосходный инструмент для контроля за сетевыми соединениями.

Поиск используемых портов

Достаточно ввести следующую команду, чтобы увидеть все задействованные порты и другую полезную информацию:

netstat -tulpn

  • Опция -t проверяет наличие TCP-соединений.
  • Опция -u проверяет наличие UDP-соединений.
  • Опция -l поручает netstat вывести список только ПРОСЛУШИВАЕМЫХ соединений, а для просмотра же всех соединений существует опция -a .
  • Опция -p показывает PID процесса.
  • Опция -n показывает числовые адреса вместо того, чтобы выводить хост, порт или имена пользователей.

В случае необходимости проверить конкретный порт просто добавьте команду grep :

netstat -tulpn | grep 8090

Пример вывода:

tcp6 0 0 :::8090 :::* LISTEN 21990/java

Поиск пользователя выполняющегося процесса

В некоторых ситуациях не помешает знать имя пользователя выполняющегося процесса. С этой целью добавьте опцию -e . Не забудьте удалить -n , иначе имя пользователя не будет получено.

$ sudo netstat -tulpe | grep 8090

tcp6 0 0 [::]:8090 [::]:* LISTEN kirshi 427760 21990/java

Выполняя запрос с правами root -пользователя, вы получаете разрешение на просмотр подробной информации обо всех процессах.

Проверка статуса сервера

Если вам нужно проверить, запущен ли сервер, например http или smtp , то команда grep позволит отфильтровать результаты:

$ sudo netstat -tuple | grep smtp

tcp 0 0 localhost:smtp 0.0.0.0:* LISTEN root 39790 2731/master
tcp6 0 0 ip6-localhost:smtp [::]:* LISTEN root 39791 2731/master

Команда curl

curl обычно применяется для передачи данных с или на сервер без взаимодействия с пользователем. Команда поддерживает такие протоколы, как HTTP, FTP, SCP, SFTP, SMTP, LDAP и многие другие.

Проверка работоспособности сервиса

С помощью Curl можно определить, работает ли сайт или сервис.

Для проверки работоспособности сайта выполните следующую команду:

$ curl -Is http://www.google.com HTTP/1.1 200 OK
Content-Type: text/html; charset=ISO-8859-1
P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info."
Date: Sun, 07 Feb 2021 22:22:10 GMT
Server: gws
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN
Transfer-Encoding: chunked
Expires: Sun, 07 Feb 2021 22:22:10 GMT
Cache-Control: private
Set-Cookie: NID=208=WV1ENCL_yTQadGsKWAuYHUyBL0Htelh0nkkSNjnFpX2XjHEBj58-ldS9vjAl6MXH0jFwQC0oabKtcmS6jia2Wn9V-1C0CckpYyW17i8l3VTsQkL2RDLS43OBKxuE5UXiSfm9iSLbIxVV94oNcjC2SPuUfUIzwCJqgxDGi7Q3qRM; expires=Mon, 09-Aug-2021 22:22:10 GMT; path=/; domain=.google.com; HttpOnly

  • Опция -s активирует тихий режим, который отключает индикатор выполнения и сообщения об ошибках.
  • Опция -I отправляет HTTP-запрос HEAD , не возвращая тело запроса.

Тестирование функциональности telnet

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

Протестируем сервер Tomcat на порту 8090 :

curl -v telnet://127.0.0.1:8090* Trying 127.0.0.1:8090...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 8090 (#0)

Если я остановлю сервер, то получу следующее сообщение об ошибке:

curl: (7) Failed to connect to 127.0.0.1 port 8090: Connection refused

Проверка соединения между приложением и другим сервисом

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

$ curl -I -s myapp:5000

myapp —  имя приложения, а 5000 —  номер порта базы данных, к которой вы стремитесь получить доступ.

Команда ps

ps  —  еще одна эффективная команда для отображения информации о текущих процессах.

Поиск PID процесса

Как правило, команда ps применяется совместно с опциями -ef :

$ ps -ef

  • Опция -e показывает все процессы.
  • -f предоставляет подробную информацию о процессах.

Пример вывода:

root 17347 1565 0 febr06 ? 00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 9900 -c

Команда grep позволяет ограничить число результатов:

$ ps -ef | grep tomcat

ps можно объединить с опциями aux для получения еще более детальной информации.

  • Опция -a показывает процессы всех пользователей.
  • -u обозначает формат, ориентированный на пользователя.
  • -x также отображает процессы, выполняющиеся в фоновом режиме.

Сортировка процессов по памяти

У вас также есть возможность сортировать процессы по использованию памяти, чтобы выяснить объемы потребляемых ими ресурсов.

$ ps aux --sort=-%mem

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
kirshi 21524 0.2 16.0 5298576 1291072 ? Sl febr06 4:59 /snap/intellij-idea-community/273/jbr/bin/java -clas
kirshi 17622 0.1 6.0 1736632 488924 ? Sl febr06 2:16 java -D[Standalone] -server -Xms64m -Xmx512m -XX:Met

Бонус: команда cat

Вы наверняка знакомы с командой cat . Как правило, для устранения проблем она не подходит, зато может пригодиться для их выявления.

Например, получив сообщение об ошибке, указывающей на сбой выполнения скрипта, допустим, в строке 21, у вас возникает естественное желание ее просмотреть. Вы можете задействовать сторонний инструмент для визуализации файла, чтобы проверить номера строк. Однако это можно сделать и с помощью cat :

$ cat -n show-time.sh

1 #!/bin/bash
2 while true; do
3 sleep 5
4 date +"Hi, the current time is %F %T"
5 done

  • Опция -n показывает номера строк в файле.

При работе с длинным файлом с помощью команды less можно перейти к нужному номеру строки сразу из терминала:

$ less +4 -N show-time.sh

4 date +"Hi, the current time is %F %T"
5 done

  • Опция -N отображает номера строк.
  • Знак + и номер осуществляют переход к нужной строке в файле.

Заключение

Мы рассмотрели ряд случаев использования таких команд, как curl , netstat , ps и lsof . Их можно эффективно применять и во многих других ситуациях, информацию о которых вы найдете на страницах руководства.

Благодарю за внимание!

Читайте также:

Читайте нас в Telegram , VK

Перевод статьи Kirshi Yin : 5 Powerful Unix Commands for Easier Troubleshooting