Як я можу виконати команду при запуску (альтернатива 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але це не працювало для мене. Будь-яка ведуча буде вдячна.


di Ви запускаєте його як root, і ви перезавантажили систему?
Джордж Удосен

@George так, я зробив і те, і інше
Saurabh Sharma

спробуйте це
Джордж Удосен

@George Це теж не працює
Saurabh Sharma

Щойно побачив цей злом, подивіться, чи летить він ...
Джордж Удосен

Відповіді:


65

Вступ

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


4
Не використовуйте, #!/bin/bashоднак використовуйте, #!/bin/shякщо вам справді не потрібен баш у вашому сценарії. Всі інші системні сценарії використовують тире, а не 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. Запуск у ubuntu 16.04 Арабська 5.31
Danny182

Як вказує відповідь @Jan, створювати абсолютно новий сервіс не потрібно, оскільки systemd вже підтримує rc.local.
TommyPeanuts

Дякую вам, уауууууууууууууууууу, це просто працює
GPrathap

2

Щоб додати відповідь Яна, що, на відміну від звичайного rc.localфайлу, rc-local serviceвиконується не після запуску всіх сервісів, а після того, як мережа вийде в Інтернет.

У деяких випадках ви можете запустити команди rc.localпізніше. Наприклад, я хотів, щоб це було виконано після lxdзапуску.

У цьому випадку ви можете редагувати rc-local serviceзалежності запуску, створивши конф-конф-файл: /etc/systemd/system/rc-local.service.d/override.conf з вмістом:

[Unit]
After=network.target lxd.service

Де ви можете додати потрібну назву одиниці (як я додав lxd.service)

Не забудьте systemctl daemon-reloadпісля цього.


Ласкаво просимо до Ask Ubuntu! Якщо ви хочете покращити іншу відповідь, будь ласка, запропонуйте її змінити. Якщо ви хочете представити часткову альтернативу, будь ласка, повторіть або цитуйте частини, які є однаковими (у випадку, якщо оригінальна відповідь зміниться) та виділіть відмінності. Ні в якому разі не створюйте нової неповної відповіді! Дякую.
Девід Фоерстер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.