Запуск 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
Использование абсолютных путей, как вы сделали, конечно же, будет работать.