ИТ Блог. Администрирование серверов на основе Linux (Ubuntu, Debian, CentOS, openSUSE)

Понимание распространенных сообщений об ошибках в Linux

Понимание распространенных сообщений об ошибках

Работа с интерфейсом командной строки Linux временами может вызывать разочарование. Хотя сценарии Bash и shell могут быть мощными, они также могут вызывать разочарование при появлении неожиданных или неясных сообщений об ошибках. В этом посте в блоге мы рассмотрим наиболее распространенные сообщения об ошибках, с которыми вы можете столкнуться, и примеры, которые могут приводить к этим ошибкам.

 

Частые ошибки команд Linux

Argument list too long

Это сообщение об ошибке появляется, когда список аргументов, переданных команде, превышает максимальную длину, разрешенную системой. Это может произойти, если вы попытаетесь удалить или перечислить все файлы в каталоге с большим количеством файлов и с использованием подстановочного знака bash или просто передадите слишком много аргументов. Кроме того, это может произойти, если вы забудете заключить аргумент, содержащий пробелы, в кавычки, в результате чего Bash интерпретирует его как несколько аргументов.

Максимальное количество аргументов в вашей системе можно оценить с помощью команды, getconf ARG_MAX которая обеспечивает максимальную длину буфера аргументов, передаваемых вызову exec(). Хотя это ненадежный способ определения максимального количества аргументов командной оболочки, смотрите это подробное объяснение. Например, вы можете создать большую тестовую папку, используя цикл командной строки bash for или dd.

Пример цикла Bash (медленный):

$> mkdir test
$> for i in {0..$(($(getconf ARG_MAX)/10))}; do touch test/$i; done
$> ls test/*
bash: ls: Argument list too long

 

Пример dd (самый быстрый):

$> mkdir test
$> dd if=/dev/zero of=test/masterfile bs=1 count=$(($(getconf ARG_MAX)/10))
104857+0 records in
104857+0 records out
104857 bytes (105 kB, 102 KiB) copied, 0.267711 s, 392 kB/s
$> split -b 1 test/masterfile test/
$> ls test/*
bash: ls: Argument list too long

 

Вы столкнетесь с аналогичной проблемой при попытке подсчитать количество файлов в большом каталоге с помощью команды ls. Лучшей альтернативой было бы подсчитать файлы с помощью команд find и wc.

 

command not found

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

$> foobar
foobar: command not found

 

cannot open display

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

$firefox
Importing existing firefox profiles from /home/nicolas/.mozilla/firefox
Found default profile: fulzrt75.default
Import done in 0.404 s
Error: no DISPLAY environment variable specified

 

В следующем примере дисплей недоступен или не существует, что приводит к сообщению об ошибке cannot open display.

$ firefox
Error: cannot open display: 0:0

 

Эта ошибка также может возникнуть, если вы пытаетесь запустить программу с графическим интерфейсом из сеанса SSH без включенной переадресации X11, например:

$> ssh user@example.com firefox
Error: cannot open display: 0:0

 

Чтобы решить эту проблему, используйте опцию -X ssh или добавьте ForwardX11 yes в свой ~/.ssh/config. Стороне сервера также необходимо будет разрешить пересылку X11, используя X11Forwarding yes конфигурацию в /etc/ssh/sshd_config.

Connection refused

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

$>  wget localhost:123
--2023-03-28 07:17:18--  http://localhost:123/
Resolving localhost (localhost)... 127.0.0.1, ::1
Connecting to localhost (localhost)|127.0.0.1|:123... failed: Connection refused.
Connecting to localhost (localhost)|::1|:123... failed: Connection refused.

 

Каталог и файлы

В разрешении отказано

Это сообщение об ошибке появляется при попытке получить доступ к файлу или каталогу, на доступ к которым у вас нет разрешения. Например, следующая команда пользователя пытается выполнить чтение из файла /etc/shadow, доступного только пользователю root, что приводит к ошибке:

$> cat /etc/shadow
cat: /etc/shadow: Permission denied

 

No such file or directory

Это сообщение об ошибке появляется при попытке доступа к файлу или каталогу, которые не существуют. Например, следующая команда cat пытается выполнить чтение из файла, который не существует:

$> cat test
cat: test: No such file or directory

 

not a directory

Это сообщение об ошибке появляется при попытке доступа к каталогу, который не является каталогом. Например, следующая командная строка пытается изменить текущий путь на файл вместо каталога, что приводит к ошибке:

$> touch test
$> cd test
cd: not a directory: test

 

File exists

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

$> mkdir test
$> mkdir test
mkdir: cannot create directory ‘test’: File exists

 

invalid option

Это сообщение об ошибке появляется, когда вы передаете недопустимый параметр команде. Например, это может произойти, если вы неправильно ввели параметр или используете параметр, не поддерживаемый командой.

$> ls -3
ls: invalid option -- '3'
Try 'ls --help' for more information.

 

Bad file descriptor

Это сообщение об ошибке появляется, когда программа пытается использовать файловый дескриптор, который не открыт. Например, следующая командная строка пытается выполнить чтение из файлового дескриптора, который не был открыт, что приводит к ошибке:

$> read -u 3 var
bash: read: 3: invalid file descriptor: Bad file descriptor

 

Синтаксическая ошибка

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

Отсутствует имя файла:

$> echo "some test" > 
bash: syntax error near unexpected token `newline'

 

Пропущенные кавычки:

$> echo 'this (works)'
this (works)
$> echo this (fail)
bash: syntax error near unexpected token `('

 

unexpected end of file

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

#!/bin/bash
# script: test.sh

if [ $# -eq 0 ]
then
    echo "The variable is zero"
fi^M

 

Вывод:

$ ./test.sh
./test.sh: line 6: syntax error: unexpected end of file

 

Удаление дополнительного ^M символа решит проблему.

Другой пример – когда вы не завершаете тела однострочной функции bash точкой с запятой:

#!/bin/bash
# script: test.sh

myfunc () { echo "$@"; exit 1 }

if [ $# -eq 0 ]
then
    echo "The variable is zero"
fi

 

Вывод:

$ ./test.sh
./test.sh: line 68: syntax error: unexpected end of file

 

Замена myfunc () { echo “$@”; exit 1 } на myfunc () { echo “$@”; exit 1; } решила бы проблему, обратите внимание на точку с запятой в конце команды exit.

 

invalid arithmetic operator

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

$> echo $((5.3 + 1))
bash: 5.3 + 1: syntax error: invalid arithmetic operator (error token is ".3 + 1")

 

Частые опечатки

division by 0

Это сообщение об ошибке появляется, когда программа пытается разделить число на ноль. Например, следующее арифметическое расширение Bash пытается разделить 5 на 0, что приводит к ошибке:

$> echo $((5 / 0))
bash: 5 / 0: division by 0 (error token is "0")

 

ambiguous redirect

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

$> echo "a" > $file_name
bash: $file_name: ambiguous redirect

 

По этой причине важно заключать переменные в кавычки. В этом примере указание имени переменной в кавычках привело бы к более значимому сообщению об ошибке, намекая на несуществующий файл или неправильную переменную.

$> echo "a" > "${file_name}"
bash: : No such file or directory

 

bad substitution

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

bash-3.2$ ${x@Q}
${x@Q}
bash: ${x@Q}: bad substitution

 

👉 ${параметр@operator}

Расширение представляет собой либо преобразование значения параметра, либо информацию о самом параметре, в зависимости от значения operator . Каждый оператор состоит из одной буквы:

Q Расширение представляет собой строку, представляющую собой значение параметра, заключенное в кавычки в формате, который может быть повторно использован в качестве входных данных.

 

Другие распространенные сообщения об ошибках

Permission denied (publickey) (Отказано в разрешении)

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

 

Segmentation fault (Ошибка сегментации)

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

 

Device not found (Устройство не найдено)

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

 

Resource temporarily unavailable (Ресурс временно недоступен)

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

 

Unable to connect to remote host (Не удается подключиться к удаленному хосту)

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

 

Out of memory (Не хватает памяти)

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

 


Это всего лишь несколько примеров из множества сообщений об ошибках, с которыми вы можете столкнуться при работе с Bash в Linux. Понимание этих сообщений об ошибках и способов их устранения необходимо для того, чтобы овладеть командной строкой Linux.

Exit mobile version