Запуск Watcher при запуске

Мне нужно отслеживать изменения в папке и ее подпапках, и я использую Watcher для этой цели. Никаких проблем до сих пор. Однако я хочу, чтобы демон Watcher работал при перезагрузке. Для начинающих я попробовал следующее.

/etc/init.d

Я создал следующий простой скрипт здесь

#! /bin/bash
watcher.py start

с watcher.py расположенный в /usr/local/bin папка. Затем я создал символическую ссылку из /etc/rc2.d папка ln -s /etc/init.d/watcher /etc/rc2.d/S99watcher и перезагрузился.

проверка watcher.py status сообщил, что не работает. Поэтому я изменил свой init.d Сценарий следующим образом

#! /bin/bash
/usr/bin/python /usr/local/bin/watcher.py start

и перезагрузился. Этот раз watcher.py status правильно сообщил Watcher как работающий.

Непосредственная проблема может быть решена, но я до сих пор не понимаю, почему. Почему из интерактивной оболочки я могу просто набрать watcher.py start чтобы запустить демон Watcher во время загрузки, мне нужно явно указать Python для запуска этого скрипта?

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

1 ответ

Решение

Когда устанавливается $PATH?

Около /etc/profile:

Как мы можем прочитать здесь:

... The /etc/profile Файл не сильно отличается, однако он используется для установки общесистемных переменных среды в оболочках пользователей. Переменные иногда те же, что в .bash_profile Однако этот файл используется для установки начального PATH или же PS1 для всех пользователей оболочки системы.

а также:

В дополнение к настройке элементов окружающей среды /etc/profile выполнит сценарии внутри /etc/profile.d/*.sh

Который означает, что $PATH (для всех пользователей) фактически устанавливается скриптами в /etc/profile.d Как мы можем также сделать вывод здесь.

Что касается моей системы, то не все точно так, как описано здесь, но информация все же подтверждается.

Быстрый (текстовый) поиск в /etc на строку: /usr/local/bin о котором я знаю это в моем (глобальном) $PATH, выдает файл /etc/environment, который содержит строку:

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"

Это именно каталоги в моем $PATH (кроме местных).

Суть в том, что $PATH не устанавливается перед сценариями в /etc/init.d запускаются, но на самом деле устанавливаются скриптами в etc/init.d

Что делать?

Ответ здесь предлагают установить $PATH переменная в верхней части скрипта. Глядя (снова) в моей системе, это именно то, что было сделано, например, с моим /etc/init.d/saned сценарий:

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

Использование абсолютных путей, как вы сделали, конечно же, будет работать.

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