Чому команда в /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) Призначенням підрозділу може бути допомога для іншого підрозділу, який має залежність від цього.
Rıfat Erdem Sahin

Я також отримую цю помилку. Якщо rc.localвимкнено, яка альтернатива?
Бен

5

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

rc.local         [ ]   [x]   [x]   [x]   [x]   [ ]   [ ]   [ ]

Так, це ввімкнено.
xx

чи потрібно встановити цю команду?
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

Вам не потрібно вручну вмикати послугу. Якщо файл існує та виконується, systemd автоматично включить rc-localпослугу.
муру

4

У нас була ця проблема на деяких розміщених серверах, що завантажують правила FW.

У цих полях вони перезавантажуються ДУЖЕ швидко, і ми виявили, що просто поміщаємо "сон 1" в rc.local, перш ніж заяви про навантаження, здається, вирішують проблему. Я думаю, що це дало трохи часу, щоб інтерфейси були влаштовані перед завантаженням правил FW.


1
Дякую. sleep 1вирішив мою проблему. Цікаво, що у мене дуже багато серверів, але лише один має цю проблему.
Qian Chen

1

Я колись редагував rc.localБлокнот у Windows, і у нього почалася ця проблема.

У цьому випадку використання текстового редактора, що підтримує EOL Conversion, наприклад Notepad ++, для перетворення стилю EOL у «Unix», може вирішити його.

Ви також можете це зробити :set ff=unixу Vim.


1

У контейнерах Ubuntu lxc я виявив, що якщо rc.local має абсолютно правильний шебанг, наприклад

#!/bin/sh

це не вдається, але якщо ви вилучите шебанг, він працює.

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


0

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

sudo systemctl enable rc-local.service

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.