Как выполнить команду при запуске (альтернатива rc.local) в Ubuntu 16.10?

49

Я устанавливаю квоту на моем сервере 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но у меня это не сработало. Любое руководство будет оценено.

Саурабх Шарма
источник
Вы запускали его как root и перезагружали свою систему?
Джордж Удосен
@ Джордж да, я сделал и то и другое
Саурабх Шарма
попробуйте это
Джордж Удосен
@ Джордж Это не так хорошо
Саурабх Шарма
Просто видел этот хак, посмотрим, летит ли он ...
Джордж Удосен

Ответы:

65

вступление

Я думаю, что вы не должны создавать новый сервис, как предложено в ссылке Джорджа. 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. Таким образом, вы просто создаете соответствующий file ( sudo touch...) и делаете его исполняемым ( sudo chmod +x ...).

январь
источник
4
Но не используйте #!/bin/bash, используйте, #!/bin/shесли вам действительно не нужен bash в вашем скрипте. Все другие системные сценарии используют тире, а не bash, из соображений производительности.
spikyjt
«нет необходимости воссоздавать или форсировать что-то, что просто делается другим способом systemd-rc-local-generator» rc-local, не позволяет упорядочить это после какого-то другого модуля, не так ли?
x-yuri
20

Я видел это решение, которое предполагает использование systemd здесь :

  1. Создать сервис:

    sudo vi /etc/systemd/system/rc-local.service
    
  2. Добавьте туда свой код:

    [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
    
  3. Создайте и убедитесь, что /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
    
  4. Включить сервис:

    sudo systemctl enable rc-local
    
  5. Запустите сервис и проверьте статус:

    sudo systemctl start rc-local.service
    sudo systemctl status rc-local.service
    
  6. Если все пойдет хорошо , вы можете добавить свои codeв /etc/rc.localфайл затем перезапустить его.

Примечание: протестировано на Lubuntu 16.10.

Источник:

https://www.linuxbabe.com/linux-server/how-to-enable-etcrc-local-with-systemd

Джордж Удосен
источник
Я сделал все шаги. У меня есть rc.local с: touch "hello"до exit 0. Служба, кажется, активна, но она не создает никаких файлов в / etc / dir.
Danny182
Как указывает ответ @Jan, создавать новый сервис не нужно, поскольку systemd уже поддерживает rc.local.
TommyPeanuts
Спасибо uuuuuuuuuuuuuuuuuuuu, это просто работает
GPrathap
2

Чтобы добавить к ответу Яна, что, в отличие от обычного 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после этого.

user2586441
источник
Добро пожаловать в Спросите Ubuntu! Если вы хотите улучшить другой ответ, предложите изменить его. Если вы хотите представить частичную альтернативу, повторите или процитируйте части, которые являются одинаковыми (в случае изменения исходного ответа), и выделите различия. В любом случае не создавайте новый неполный ответ! Спасибо.
Дэвид Фёрстер