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

У меня есть одна команда в моем скрипте /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 не выполняется во время запуска?

39
задан 13 April 2017 в 15:24

8 ответов

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

sudo systemctl enable rc-local.service

0
ответ дан 13 April 2017 в 15:24

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

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

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

0
ответ дан 13 April 2017 в 15:24

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

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

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

sudo systemctl enable rc-local.service

https://askubuntu.com/a/770033/395498 [ 111]

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

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

0
ответ дан 13 April 2017 в 15:24

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

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

0
ответ дан 13 April 2017 в 15:24

Убедитесь, что скрипт 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
0
ответ дан 13 April 2017 в 15:24

Сценарий 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 сценарии и посмотреть, сможете ли вы запускать команды при запуске сети.

0
ответ дан 13 April 2017 в 15:24

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

rc.local         [ ]   [x]   [x]   [x]   [x]   [ ]   [ ]   [ ]
0
ответ дан 13 April 2017 в 15:24

Я нашел в Ubuntu lxc контейнеры, что, если rc.local имеет совершенно корректную хижину, например,

#!/bin/sh

, он перестал работать, но если Вы удаляете хижину, он работает.

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

1
ответ дан 11 October 2019 в 15:30

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

Похожие вопросы: