Запустите скрипт с помощью rc.local: скрипт работает, но не при загрузке - PullRequest
37 голосов
/ 16 октября 2011

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

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

Я точно видел, что случилось, manager.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): да, это работает!Однако, если я выполняю перезагрузку, процесс node не выполняется, /var/log/php-jobs.log не существует и, следовательно, manager.js не работает.Что происходит?

Ответы [ 16 ]

69 голосов
/ 05 декабря 2012

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

#!/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
10 голосов
/ 15 апреля 2014

В некоторых 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 была просто символической ссылкой.

5 голосов
/ 03 декабря 2012

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

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

5 голосов
/ 30 ноября 2011

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

4 голосов
/ 16 октября 2011

Вы также могли бы заставить его работать, указав полный путь к узлу.Кроме того, если вы хотите запустить команду оболочки в качестве демона, вы должны закрыть стандартный ввод, добавив 1 <& - перед &.</p>

2 голосов
/ 25 марта 2015

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

chmod +x /etc/rc.local
2 голосов
/ 23 апреля 2014

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

sudo chkconfig firstboot off

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

1 голос
/ 29 мая 2015

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

$ cd  /etc/profile.d

$ vim yourstuffs.sh

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

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

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

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

1 голос
/ 25 апреля 2013

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

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

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

0 голосов
/ 16 мая 2019

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

...