Поиск по сайту:

Как включить /etc/rc.local с помощью Systemd


Если вы используете дистрибутив Linux, использующий Systemd, вы можете обнаружить, что ваша команда в файле /etc/rc.local не запускается во время загрузки системы. В этом руководстве объясняется, как включить запуск сценария /etc/rc.local при запуске системы.

Включите /etc/rc.local в Systemd

Если вы введете в терминале следующую команду:

sudo systemctl status rc-local

Вы можете получить этот вывод:

● rc-local.service - /etc/rc.local Compatibility
 Loaded: loaded (/lib/systemd/system/rc-local.service; static; vendor preset: enabled)
 Active: failed (Result: exit-code) since Thu 2015-11-26 23:54:58 CST; 59s ago
 Process: 1001 ExecStart=/etc/rc.local start (code=exited, status=1/FAILURE)
Nov 26 23:54:57 vivid rc.local[1001]: File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 920, in require
Nov 26 23:54:57 vivid rc.local[1001]: needed = self.resolve(parse_requirements(requirements))
Nov 26 23:54:57 vivid rc.local[1001]: File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 807, in resolve
Nov 26 23:54:57 vivid rc.local[1001]: raise DistributionNotFound(req)
Nov 26 23:54:57 vivid rc.local[1001]: pkg_resources.DistributionNotFound: shadowsocks==2.8.2
Nov 26 23:54:58 vivid sudo[1008]: pam_unix(sudo:session): session closed for user root
Nov 26 23:54:58 vivid systemd[1]: rc-local.service: control process exited, code=exited status=1
Nov 26 23:54:58 vivid systemd[1]: Failed to start /etc/rc.local Compatibility.
Nov 26 23:54:58 vivid systemd[1]: Unit rc-local.service entered failed state.
Nov 26 23:54:58 vivid systemd[1]: rc-local.service failed.

И если вы попытаетесь включить /etc/rc.local для запуска при загрузке системы с помощью команды:

sudo systemctl enable rc-local

Вы можете получить:

The unit files have no [Install] section. They are not meant to be enabled
 using systemctl.
 Possible reasons for having this kind of units are:
 1) A unit may be statically enabled by being symlinked from another unit's
 .wants/ or .requires/ directory.
 2) A unit's purpose may be to act as a helper for some other unit which has
 a requirement dependency on it.
 3) A unit may be started when needed via activation (socket, path, timer,
 D-Bus, udev, scripted systemctl call, ...).

Решение

Как вы можете видеть выше, в файле модуля нет раздела [Install]. Таким образом, Systemd не может включить его. Сначала нам нужно создать файл:

sudo nano /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

Сохраните и закройте файл. Чтобы сохранить файл в текстовом редакторе Nano, нажмите Ctrl+O, затем нажмите Enter для подтверждения. Чтобы выйти из файла, нажмите Ctrl+X. Затем выполните следующую команду, чтобы убедиться, что файл /etc/rc.local является исполняемым.

sudo chmod +x /etc/rc.local

Примечание. Начиная с версии 16.10, Ubuntu больше не поставляется с файлом /etc/rc.local. Вы можете создать файл, выполнив эту команду.

printf '%s\n' '#!/bin/bash' 'exit 0' | sudo tee -a /etc/rc.local

Затем добавьте разрешение на выполнение в файл /etc/rc.local.

sudo chmod +x /etc/rc.local

После этого включите службу при загрузке системы:

sudo systemctl enable rc-local

Выход :

Created symlink from /etc/systemd/system/multi-user.target.wants/rc-local.service to /etc/systemd/system/rc-local.service.

Теперь запустите службу и проверьте ее статус:

sudo systemctl start rc-local.service
sudo systemctl status rc-local.service

Выход :

● rc-local.service - /etc/rc.local Compatibility
 Loaded: loaded (/etc/systemd/system/rc-local.service; enabled; vendor preset: enabled)
 Active: active (running) since Fri 2015-11-27 00:32:56 CST; 14min ago
 Process: 879 ExecStart=/etc/rc.local start (code=exited, status=0/SUCCESS)
 Main PID: 880 (watch)
 CGroup: /system.slice/rc-local.service

Крон @reboot

Если описанный выше метод вам не подходит или вы просто хотите, чтобы при загрузке системы выполнялись некоторые простые команды, вы также можете использовать функцию @reboot в cron для автоматического выполнения команды при загрузке системы. Например, я хочу, чтобы мой клиент Shadowsocks запускался автоматически, поэтому я открываю файл cron привилегированного пользователя:

sudo crontab -e

И в конце поместите следующую строку.

@reboot /usr/bin/sslocal -c /etc/shadowsocks.json -d start

Сохраните и закройте файл.

В некоторых дистрибутивах Linux, таких как Archlinux, демон cron по умолчанию не включен. Поэтому вам придется вручную включить его. Чтобы включить его в Archlinux, введите следующую команду в терминале.

sudo systemctl enable cronie

Shadowsocks — это прокси-сервер Socks5, который можно использовать для обхода брандмауэров Интернета. Если вам интересно, нажмите ссылку ниже, чтобы узнать, как настроить собственный сервер Shadowsocks.

  • Настройте свой собственный сервер Shadowsocks на Debian, Ubuntu и Centos.

Как использовать Systemd

Хотите узнать больше о systemd для эффективного управления вашей системой? Пожалуйста, прочитайте следующий урок.

  • Как использовать Systemd для управления службами, уровнями запуска и журналами в Linux

Статьи по данной тематике