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



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

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


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


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




806   0  

Comments

    Ничего не найдено.