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

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

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

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

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

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

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

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

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

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

2 ответа

Решение

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

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

Другие вопросы по тегам