Как выполнить команду при запуске (альтернатива rc.local) в Ubuntu 16.10?
Я устанавливаю квоту на моем сервере Linode под управлением Ubuntu 16.10, и я получаю следующую ошибку
Невозможно stat() подключенное устройство /dev/root: нет такого файла или каталога
Таким образом, чтобы исправить это, я достиг этой темы для исправления, которое делается путем добавления
ln -s /dev/xvda /dev/root
/etc/init.d/quota restart
к /etc/rc.local
, Но Ubuntu 16.10 не использует rc.local
больше вместо этого использует systemd. Какая альтернатива для rc.local
Как я могу запустить вышеуказанные команды при запуске?
Также я включил сервис, используя systemctl enable rc-local.service
но это не сработало для меня. Любое руководство будет оценено.
3 ответа
вступление
Я думаю, что вы не должны создавать новый сервис, как предложено в ссылке Джорджа. rc-local.service
уже существует в systemd, и служебный файл предполагает, что rc.local
, если он существует и является исполняемым, автоматически загружается вmulti-user.target
, Так что нет необходимости воссоздавать или форсировать что-то, что просто сделано другим способом systemd-rc-local-generator
,
Одно решение
Быстрый обходной путь (я не знаю, является ли это каноническим способом):
В терминале делаем:
printf '%s\n' '#!/bin/bash' 'exit 0' | sudo tee -a /etc/rc.local
sudo chmod +x /etc/rc.local
sudo reboot
После этого rc.local
будет вызвано при запуске системы. Вставьте, что вы хотите.
Фон
Если вы делаете в терминале:
sudo systemctl edit --full rc-local
Вы можете видеть, что заголовок комментария содержит такие строки, как:
# This unit gets pulled automatically into multi-user.target by
# systemd-rc-local-generator if /etc/rc.local is executable.
Это указывает на то, что в этой системе, если есть файл с именем /etc/rc.local
который является исполняемым, то он будет автоматически загружен в multi-user.target. Таким образом, вы просто создаете соответствующий файл (sudo touch...
) и сделать его исполняемым (sudo chmod +x ...
).
Я видел это решение, которое предполагает использование systemd
здесь:
Создать сервис:
sudo vi /etc/systemd/system/rc-local.service
Добавьте туда свой код:
[Unit] Description=/etc/rc.local Compatibility ConditionPathExists=/etc/rc.local [Service] Type=forking ExecStart=/etc/rc.local start TimeoutSec=0 StandardOutput=tty RemainAfterExit=yes SysVStartPriority=99 [Install] WantedBy=multi-user.target
Создай и убедись
/etc/rc.local
является исполняемым и добавить этот код внутри него:sudo chmod +x /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. exit 0
Включить сервис:
sudo systemctl enable rc-local
Запустите сервис и проверьте статус:
sudo systemctl start rc-local.service sudo systemctl status rc-local.service
Если все идет хорошо, вы можете добавить свой
code
к/etc/rc.local
затем перезапустите файл.
Примечание: протестировано на Lubuntu 16.10.
Источник:
https://www.linuxbabe.com/linux-server/how-to-enable-etcrc-local-with-systemd
Чтобы добавить к ответу Яна, что, в отличие от обычного rc.local
файл, rc-local service
выполняется не после запуска всех служб, а после выхода в сеть
В некоторых случаях вы можете запускать команды из rc.local
потом. Например, я хотел, чтобы он был выполнен после lxd
Начните.
В этом случае вы можете редактировать rc-local service
зависимости при запуске, создавая выпадающий файл conf:/etc/systemd/system/rc-local.service.d/override.conf
с содержанием:
[Unit]
After=network.target lxd.service
Где вы можете добавить имя нужного устройства (как я добавил lxd.service
)
Не забудь systemctl daemon-reload
после этого.