Почему мой скрипт завершился с ошибкой, статус 127?

Вопрос или проблема

Я написал сценарий для настройки маршрута на конкретном интерфейсе в linux (CentOS 6.0) и поместил его в путь сценариев Networkmanager (/etc/Networkmanager/dispatcher.d)
с самым высоким префиксом номера. (я также дал разрешение на выполнение.)

Это мой сценарий:

#!/bin/bash

if [[ "$1" == "eth1" ]] && [[ "$2" == "up" ]]
then
    ip route add 192.XX.XX.0/24 dev eth1 src 192.XX.XX.XX table eth1
    #logger запуск сценария.
fi

Но когда eth1 активен, я вижу эту ошибку в списке сообщений syslog:

localhost nm-dispatcher.action: Скрипт '/etc/NetworkManager/dispatcher.d/99-eth' завершился с ошибкой 127.

Может кто-то сказать, в чём моя ошибка??

Я не могу комментировать, поэтому мне придется ответить.

Ошибка 127 означает, что либо используемая команда не найдена или ваш скрипт не имеет разрешения на выполнение (+x).
Больше информации в продвинутом руководстве по bash-скриптам на http://tldp.org/LDP/abs/html/exitcodes.html

Ответ или решение

Ошибка "exit status 127" указывает на то, что команда, которая была вызвана, не найдена или что сам скрипт не имеет прав на исполнение. Давайте рассмотрим возможные причины этого статуса, основываясь на предоставленной вами информации.

1. Убедитесь, что ваш скрипт действительно исполняем

Первый шаг — проверить, что ваш скрипт имеет права на исполнение. Чтобы установить права на исполнение, выполните следующую команду:

chmod +x /etc/NetworkManager/dispatcher.d/99-eth

Проверьте, что смена прав прошла успешно:

ls -l /etc/NetworkManager/dispatcher.d/99-eth

В выводе должна отображаться буква x (исполняемый) для пользователя, группы и/или всех пользователей.

2. Проверьте наличие команды ip

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

Убедитесь, что команда ip доступна, выполнив:

which ip

или

ip --version

Если команда не найдена, это может быть причиной ошибки 127.

3. Убедитесь, что скрипт выполняется в контексте, где доступны необходимые команды

В зависимости от того, как запускается ваш скрипт (например, от NetworkManager), окружение может отличаться от вашего пользовательского. Чтобы убедиться, что команды доступны, вы можете добавить следующую строку в начало вашего скрипта, чтобы вывести переменные окружения и проверить, что нужные команды в PATH:

echo $PATH > /tmp/script_path.txt

После того как скрипт выполнится, откройте файл /tmp/script_path.txt и проверьте, присутствуют ли пути к ip.

4. Отладка

Чтобы получить больше информации об ошибке, полезно добавить отладочную информацию в скрипт. Так вы сможете видеть каждую команду перед её выполнением:

#!/bin/bash

set -x  # Включает вывод команд перед исполнением
if [[ "$1" == "eth1" ]] && [[ "$2" == "up" ]]
then
    ip route add 192.XX.XX.0/24 dev eth1 src 192.XX.XX.XX table eth1
fi
set +x  # Выключает вывод команд

5. Убедитесь в правильности синтаксиса

Вы также можете проверить, нет ли в вашем скрипте ошибок синтаксиса. Хотя в вашем приведённом коде синтаксис кажется правильным, иногда такие мелочи, как неправильные скобки или символы, могут вызывать неожиданные ошибки. Используйте команды вроде bash -n your_script.sh для проверки синтаксиса.

Заключение

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

Если ни один из предложенных шагов не обнаружит проблем, стоит рассмотреть возможность проверки других аспектов конфигурации вашего окружения или версии используемого ПО.

Оцените материал
Добавить комментарий

Капча загружается...