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

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. Их можно эффективно применять и во многих других ситуациях, информацию о которых вы найдете на страницах руководства. 

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

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

Читайте нас в Telegram, VK и Яндекс.Дзен


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

Предыдущая статьяРендеринг на стороне сервера против статической генерации сайта
Следующая статьяЧто такое Hoisting в JavaScript