Запустите скрипт с rc.местные: скрипт работает, но не при загрузке

у меня есть узел.JS скрипт, который нужно запустить при загрузке и запуск под пользователем www-data. Во время разработки я всегда начинал скрипт с:

su www-data -c 'node /var/www/php-jobs/manager.js

Я точно видел, что произошло, менеджер.js отлично работает. Поиск, поэтому я обнаружил, что должен поместить это в свой /etc/rc.local. Кроме того, я научился указывать вывод в файл журнала и добавлять 2>&1 для "перенаправления stderr в stdout", и это должен быть демон, поэтому последний символ &.

наконец-то, мой /etc/rc.local выглядит так:

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

su www-data -c 'node /var/www/php-jobs/manager.js >> /var/log/php-jobs.log 2>&1 &'

exit 0

если я запустил это сам (sudo /etc/rc.local): да, это работает! Однако, если я выполню перезагрузку no

15 ответов


в этом примере rc.локальный скрипт я использую перенаправление ввода-вывода в самой первой строке выполнения в свой собственный файл журнала:

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

exec 2> /tmp/rc.local.log  # send stderr from rc.local to a log file
exec 1>&2                      # send stdout to the same log file
set -x                         # tell sh to display commands before execution

/opt/stuff/somefancy.error.script.sh

exit 0

на некоторых linux (Centos & RH, например),/etc/rc.local изначально это просто символическая ссылка на /etc/rc.d/rc.local. В этих системах, если символическая ссылка нарушена, и /etc/rc.local Это отдельный файл, то изменения /etc/rc.local не будет видно при загрузке-процесс загрузки будет запущена версия /etc/rc.d. (Они будут работать, если один работает /etc/rc.local вручную, но не будет работать при загрузке.)

звучит как в системе dimadima, они являются отдельными файлами, но /etc/rc.d/rc.local звонки /etc/rc.local

в символическая ссылка от /etc/rc.local к "реальному" в /etc/rc.d может потеряться при переводе rc.local в резервный каталог и копирует его обратно или создает его с нуля, не понимая оригинал в /etc была просто символической ссылкой.


Я закончил с выскочка, который работает нормально.


В Ubuntu я заметил, что есть 2 файла. Настоящий -/etc/init.d/rc.local; похоже, другой /etc/rc.local богусь?

как только я изменил правильный (/etc/init.d/rc.local) Он выполнил так, как ожидалось.


вы также могли бы заставить его работать, указав полный путь к узлу. Кроме того, если вы хотите запустить команду оболочки в качестве демона, вы должны закрыть stdin, добавив 1


если вы используете linux на облаке, то обычно у вас нет возможности коснуться реального оборудования с помощью рук. таким образом, вы не видите интерфейс конфигурации при загрузке в первый раз и, конечно, не можете его настроить. В результате firstboot сервис всегда будет на пути к rc.local. Решение состоит в том, чтобы отключить firstboot делаем:

sudo chkconfig firstboot off

если вы не уверены, почему ваш rc.local не запускается, вы всегда можете проверить из /etc/rc.d/rc файл, потому что этот файл будет всегда запускайте и вызывайте другие подсистемы (например, rc.местный.)


У меня была та же проблема (на CentOS 7), и я исправил ее, предоставив разрешения на выполнение /etc/local:

chmod +x /etc/rc.local

Я получил свой скрипт для работы путем редактирования /etc/rc.local затем выполните следующие 3 команды.

sudo mv /filename /etc/init.d/
sudo chmod +x /etc/init.d/filename 
sudo update-rc.d filename defaults

теперь скрипт работает при загрузке.


Я использую CentOS 7.

$ cd  /etc/profile.d

$ vim yourstuffs.sh

введите следующее в yourstuffs.sh сценарий.

введите все, что вы хотите здесь выполнить

export LD_LIBRARY_PATH=/usr/local/cuda-7.0/lib64:$LD_LIBRARY_PATH

сохранить и перезагрузить ОС.


Это, скорее всего, вызвано отсутствующей или неполной переменной среды PATH.

Если вы предоставите полные абсолютные пути к вашим исполняемым файлам (su и node), он будет работать.


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


я использовал rc.местные в прошлом. Но я узнал из своего опыта, что самый надежный способ запустить скрипт во время загрузки системы-использовать @ reboot команда в crontab. Например:

@reboot path_to_the_start_up_script.sh

сначала сделайте скрипт исполняемым с помощью sudo chmod 755 /path/of/the/file.sh теперь добавьте скрипт в rc.местный sh /path/of/the/file.sh прежде чем покинуть 0 в rc.местный, затем сделайте rc.местные к исполняемым с sudo chmod 755 /etc/rc.local рядом с инициализацией rc.местное использование sudo /etc/init.d/rc.local start это инициирует rc.местный Теперь перезагрузите систему. Сделанный..


1 Не рекомендуется использовать root для запуска приложений, таких как node app.

Ну, вы можете это сделать, но можете поймать больше исключений.

2 rc.локальный обычно работает как пользователь root.

поэтому, если ваш скрипт должен работать как другой пользователь, такой как www U, убедитесь, что путь и другая среда в порядке.

3 я нахожу простой способ запустить службу в качестве пользователя:

sudo-u www-i / The / path/of / your / script

пожалуйста, предпочитайте sudo руководство~ -я [команда] Опция-i (имитация начального входа в систему) запускает оболочку, заданную записью базы данных паролей целевого пользователя в качестве loginshell...


rc.local работает только при запуске. Если вы перезагрузитесь и хотите, чтобы скрипт выполнялся, он должен перейти в начиная с в k99 префикс.