Почему команда в /etc/rc.local не выполняется во время запуска?

39

В моем /etc/rc.localскрипте есть одна команда, которая должна запускать демон обновления Tiny Tiny RSS во время запуска, но сценарий не запускается во время запуска. Зачем?

Весь файл /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.

/sbin/start-stop-daemon -b -c www-data:www-data -S -x /usr/bin/php /var/www/ttrss/update_daemon2.php -- -quiet

exit 0

/etc/rc.local является исполняемым:

# ls -l /etc/rc.local
-rwxr-xr-x 1 root root 342 May 25 16:14 /etc/rc.local

/etc/init.d/rc.local существует и является исполняемым:

# ls -l /etc/init.d/rc.local
-rwxr-xr-x 1 root root 801 Jul 27  2012 /etc/init.d/rc.local

/etc/init.d/rc.local предполагается выполнить при запуске для этого уровня запуска:

# runlevel 
N 2
# ls -l /etc/rc2.d/S99rc.local 
lrwxrwxrwx 1 root root 18 Sep 22  2012 /etc/rc2.d/S99rc.local -> ../init.d/rc.local

Если я вручную вызываю /etc/rc.local из командной строки, update_daemon загружается ...

# /etc/rc.local
# ps ax | grep update_daemon2.php
2233 ?        S      0:00 /usr/bin/php /media/sda5/www/news/update_daemon2.php -quiet
2234 ?        S      0:00 /usr/bin/php /media/sda5/www/news/update_daemon2.php -quiet

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

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

Почему команда в rc.local не выполняется во время запуска?

хх
источник
Может быть из-за requirettyнастройки. Когда вы вошли в систему, вы выполняете сценарий в TTY, но во время загрузки системы его нет в TTY. Эта ссылка может помочь вам shell-tips.com/2014/09/08/… Спасибо.
KICT

Ответы:

23

rc.localСценарий завершается, если при выполнении какой-либо из его команд возникает какая-либо ошибка (упомяните -eфлаг в #!/bin/sh -e).

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

Я сталкивался с тем же самым, когда вручную настраивал процессор и не делал этого rc.local. Вот мой собственный обходной путь, который используется update-rc.dдля запуска ваших команд при запуске:

  1. Создайте файл myscript.shв каталоге /etc/init.dс заголовком:#!/bin/sh
  2. Поместите ваши пользовательские команды в качестве контента
  3. Сделайте его исполняемым: sudo chmod +x /etc/init.d/myscript.sh
  4. Создайте символические ссылки для вашего скрипта для различных уровней запуска: sudo update-rc.d myscript.sh defaults

Кроме того, вы можете проверить /etc/network/if-up.dскрипты и посмотреть, сможете ли вы запускать команды при запуске сети.

Нарисовался
источник
Спасибо за ответ. После того, как я опубликовал вопрос, мои настройки изменились, поэтому я не могу проверить, решил ли ваш ответ проблему.
XX
Пожалуйста, скажите мне, что делает шаг 4? Я новичокupdate-rc.d
Mohith7548
7

у меня была похожая проблема в rc.local не выполняется при запуске

sshades дал мне следующий ответ:

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

sudo systemctl enable rc-local.service

https://askubuntu.com/a/770033/395498

хотя я не проверял его решение, я думаю, что это звучит логично и будет работать. Тем не мение :

Я также нашел решение, что добавление скрипта в ./.config/autostart-scripts/ поможет

Диета Бос
источник
7
Получаю эту ошибку. Файлы модулей не имеют конфигурации установки (WantedBy, RequiredBy, также, настройки псевдонимов в разделе [Install] и DefaultInstance для шаблонных модулей). Это означает, что они не предназначены для включения с помощью systemctl. Возможные причины наличия такого типа юнитов: 1) Юнит может быть статически включен, если он символически связан с каталогом .wants / или .requires / другого юнита. 2) Цель юнита может заключаться в том, чтобы выступать в качестве помощника для какого-то другого юнита, который зависит от требований.
Рифат Эрдем Сахин
Я также получаю эту ошибку. Если rc.localвыключено, какая альтернатива?
Бен
5

попробуйте sudo sysv-rc-confи проверьте, rc.localвключен ли

rc.local         [ ]   [x]   [x]   [x]   [x]   [ ]   [ ]   [ ]
Zuba
источник
Да, это включено.
хх
эта команда должна быть установлена?
jcollum
1
@jcollum да, это программа из пакета с таким же названием. Для установки наберитеsudo apt install sysv-rc-conf
banan3'14
rc.localдаже нет в моем списке услуг!
Бен
5

Убедитесь, что скрипт rc.local является исполняемым:

sudo chmod +x /etc/rc.local

Затем включите его:

sudo systemctl enable rc-local.service

Перезагрузите систему или запустите скрипт вручную, запустив:

sudo systemctl start  rc-local.service

Статус сервиса можно отобразить, запустив:

$ sudo systemctl status rc-local.service
 rc-local.service - /etc/rc.local Compatibility
   Loaded: loaded (/lib/systemd/system/rc-local.service; static; vendor preset: enabled) 
Drop-In: /lib/systemd/system/rc-local.service.d
           └─debian.conf
   Active: active (running) since Mon 2018-04-02 10:39:44 -03; 1s ago
  Process: 2044 ExecStart=/etc/rc.local start (code=exited, status=0/SUCCESS)
 Main PID: 2049 (svscanboot)
Tasks: 3
 Memory: 556.0K
CPU: 10ms
CGroup: /system.slice/rc-local.service
leobocao
источник
Вам не нужно вручную включать услугу. Если файл существует и является исполняемым, systemd автоматически включит rc-localслужбу.
Муру
4

У нас была эта проблема на некоторых хостинговых серверах, загружающих правила FW.

На этих блоках они ОЧЕНЬ быстро перезагружаются, и мы обнаружили, что просто поместили «sleep 1» в rc.local до того, как операторы загрузки, похоже, решат проблему. Я полагаю, что это дало немного времени на настройку интерфейсов перед загрузкой правил FW.

Саймон Харт
источник
1
Спасибо. sleep 1решил мою проблему. Интересно, что у меня много серверов, но только один имеет эту проблему.
Цянь Чен
1

Я однажды отредактировал rc.localс помощью Блокнота в Windows, и у него появилась эта проблема.

В этом случае использование текстового редактора с поддержкой преобразования EOL, такого как Notepad ++, для преобразования стиля EOL в 'Unix' может решить эту проблему.

Вы также можете сделать это :set ff=unixв Vim.

SyaSyaNown
источник
1

В контейнерах Ubuntu lxc я обнаружил, что если rc.local имеет совершенно правильный shebang, например

#!/bin/sh

это терпит неудачу, но если вы удалите shebang, это работает.

Не до конца поняв, почему или какую оболочку он использует, я думаю, что он тоже бомбит первый ненулевой. (В других Ubuntu установка правильного shebang не проблема)

teknopaul
источник
0

Вам нужно будет убедиться, что /etc/rc.localэто выполняется во время запуска сервера с помощью команды:

sudo systemctl enable rc-local.service

Уильям
источник