Назад | Перейти на главную страницу

Почему для rc.local требуются абсолютные пути? Как я могу запустить сценарий при запуске, который их не использует?

У меня есть сценарий, который запускается при запуске из rc.local в CentOS. Этот сценарий содержит команду для компиляции моего проекта erlang с помощью сторонней команды сборки, называемой rebar. Линия арматуры не может скомпилировать мой проект при запуске, но если я запустил ее вручную, проект компилируется нормально. Я предполагаю, что это связано с тем, что команда арматуры вызывает другие команды без абсолютных путей.

Как я могу запустить команду при запуске, но в контексте, который не требует абсолютных путей?

Я не хочу исправлять эту стороннюю команду (и иметь дело с неизбежной бюрократией, которая сопровождает этот беспорядок) и / или сохранять свой собственный параллельный форк проекта только для поддержания этой дополнительной функции.

Мне также любопытно, почему я не могу это погуглить. Кажется, что это должно происходить так часто, что люди захотят использовать команду в rc.local, которая сама по себе не использует все вызовы команд абсолютного пути. Более того, я считаю, что ответ должен быть тривиальным, поскольку я могу войти в систему сразу после запуска и запустить любую команду, которая мне нравится, от имени пользователя root, который также является пользователем, от имени которого запускается rc.local! Разве нет ловушки, с помощью которой вы можете запустить сценарий в контексте «да, мы действительно полностью загружены, давайте запустим этот сценарий как полностью равноправный пользователь в системе без каких-либо произвольных ограничений»?

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

РЕДАКТИРОВАТЬ:

(Я не собираюсь ждать 8 часов, чтобы ответить на свой вопрос, так что ...)

Что ж, похоже, установка PATH работает. Мне кажется, у меня создалось впечатление, что команды в rc.local и его дочерних элементах просто не ищутся в PATH даже после вызова сценария bash, но это неправильно. (@TiZon дал мне хороший ключ к разгадке.) Причина, по которой у меня сложилось такое впечатление, заключается в том, что каждый результат Google говорил спрашивающему использовать абсолютные пути в вызовах команд, хотя это громоздко для чего-либо, кроме тривиальных сценариев или сценариев, которые зависят от сторонних команд. которые не следуют этому правилу. Вместо этого ответ состоит в том, чтобы вызвать сценарий bash с правильной строкой shebang, выяснить, что такое PATH вашей обычной среды, повторив его во время обычного сеанса, а затем установить PATH в сценарии запуска bash на обычный.

Надеюсь, этот ответ всплывет в Google и поможет другим бедным заблудшим душам.

Попробуйте поставить /bin/bash перед вашей командой. Вы не можете использовать относительные пути, потому что нет среды для их отслеживания. Если вы запустите все в оболочке bash, bash будет отслеживать эти вещи за вас. То же самое касается crontab

Имейте в виду, что rc.local запускается по пути /, а не по пути, по которому он расположен.
Поэтому, если вы вызываете сценарий из rc.local, например
/home/myscript
и если этот сценарий сам содержит относительные пути (т.е. он был написан с предположением, что он запускается из / home), то он завершится ошибкой при запуске из /.
Любой сценарий, который вы хотите запустить из rc.local, следует протестировать, запустив его из /:
cd /
./home/myscript
Если он работает нормально, то можете быть уверены, что нет проблем с абсолютными / относительными путями.