В связи с тем, что выявление неисправностей в работе приложения может потребовать очень много времени, важно знать различные команды, упрощающие поиск и устранение проблем.
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.comHTTP/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
. Их можно эффективно применять и во многих других ситуациях, информацию о которых вы найдете на страницах руководства.
Благодарю за внимание!
Читайте также:
- 9 советов для быстрой работы в UNIX и Linux терминале
- Как улучшить работу с кодом на TypeScript с VSCode
- Выход из тени: 6 малоизвестных команд Linux
Читайте нас в Telegram, VK и Яндекс.Дзен
Перевод статьи Kirshi Yin: 5 Powerful Unix Commands for Easier Troubleshooting