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

27

Я устанавливаю квоту на моем сервере Linode под управлением Ubuntu 16.10, и я получаю следующую ошибку

Cannot stat() mounted device /dev/root: No such file or directory

Итак, чтобы исправить это, я достиг этого потока для исправления, которое выполняется добавлением

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

    
задан Saurabh Sharma 23.02.2017 в 18:55
источник

3 ответа

35

Введение

Я думаю, вам не следует создавать новую услугу, как это предлагается в ссылке Джорджа. rc-local.service уже существует в systemd, и файл службы предполагает, что rc.local , если он существует и является исполняемым, автоматически извлекается в multi-user.target . Поэтому нет необходимости воссоздать или заставить что-то, что только что сделано другим способом systemd-rc-local-generator .

Одно решение

Быстрое обходное решение (я не знаю, каков ли это канонический путь):

В терминале do:

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 ... ).

    
ответ дан Jan 28.05.2017 в 05:27
источник
13

Я видел это решение, которое предполагает использование 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.

Источник:

Ссылка

    
ответ дан George Udosen 23.02.2017 в 19:31
0

Чтобы добавить к ответ Ян , который, в отличие от обычного файла 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 19.06.2018 в 12:11