Источник: 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 . Их можно эффективно применять и во многих других ситуациях, информацию о которых вы найдете на страницах руководства.
Благодарю за внимание!
Читайте также:
Перевод статьи Kirshi Yin : 5 Powerful Unix Commands for Easier Troubleshooting