включить shell скрипт rc.local в systemd при загрузке системы

Thank you for reading this post, don't forget to subscribe! 
скрипт обо­лоч­ки /etc/rc.local исполь­зу­ет­ся раз­ра­бот­чи­ка­ми и систем­ным адми­ни­стра­то­ром Linux для вызо­ва дру­гих скрип­тов или команд после загруз­ки всех служб.
Обыч­но /etc/rc.local вызы­ва­ет­ся в кон­це, когда Linux init пере­клю­ча­ет­ся на мно­го­поль­зо­ва­тель­ский уро­вень запуска.
Одна­ко по умол­ча­нию поддерж­ка /etc/rc.local отклю­че­на в systemd.
В этой ста­тье мы пока­жем, как вклю­чить и выпол­нить скрипт обо­лоч­ки rc.local во вре­мя загруз­ки с помо­щью systemd в Linux.

Включение скрипта оболочки rc.local в systemd при загрузке системы Linux

Сов­ме­сти­мость с /etc/rc.local дости­га­ет­ся через systemd с помо­щью спе­ци­аль­ной служ­бы под назва­ни­ем rc-local.service.

Этот модуль авто­ма­ти­че­ски вызы­ва­ет­ся в multi-user.target систе­мой systemd-rc-local-generator, если /etc/rc.local явля­ет­ся исполняемым.

Выполнение скрипта оболочки rc.local во время загрузки с использованием systemd

Есте­ствен­но, создай­те или обновите/отредактируйте файл с име­нем /etc/rc.local с помо­щью ваше­го люби­мо­го тек­сто­во­го редактора.

Я соби­ра­юсь исполь­зо­вать коман­ду vim:

$ sudo vim /etc/rc.local
## RHEL/CentOS/Fedora Linux отредактируйте файл /etc/rc.d/rc.local ##
$ sudo vim /etc/rc.d/rc.local

Добавь­те необ­хо­ди­мые коман­ды или вызо­ви­те скрипт.
Вот мой файл:

[codesyntax lang="php"]

[/codesyntax]

Убе­ди­тесь, что вы уста­но­ви­ли пра­ва на испол­не­ние фай­ла с помо­щью коман­ды chmod:

$ sudo chmod -v +x /etc/rc.local

Настройка rc-local.service в Linux, когда systemd запускается

Все, что нам нуж­но сде­лать, это вве­сти сле­ду­ю­щую коман­ду systemctl:

$ sudo systemctl enable rc-local.service

Пере­за­гру­зи­те Linux:
$ sudo reboot
Про­верь­те ста­тус после перезагрузки:
$ sudo systemctl status rc-local.service
Вот что мы уви­дим на экране:

Как посмотреть конфигурацию сервиса

Открой­те при­ло­же­ние тер­ми­нал и введите:

$ sudo systemctl cat rc-local.service

Мы уви­дим кон­фи­гу­ра­цию systemd сле­ду­ю­щим образом:

При­ме­ча­ние. Запу­сти­те sudo SYSTEMD_LOG_LEVEL=debug /usr/lib/systemd/system-generators/systemd-rc-local-generator для отлад­ки про­блем с /etc/rc.local, когда скрипт не загружается.

Информация об уровнях выполнения Linux

Когда по умол­ча­нию исполь­зо­вал­ся init, у нас были сле­ду­ю­щие уров­ни запуска:

  • S – загру­зить систе­му Linux
  • 0 – выклю­чить Linux
  • 6 – Пере­за­гру­зить Linux
  • 1 – Одно­поль­зо­ва­тель­ский режим Linux, исполь­зу­е­мый для вос­ста­нов­ле­ния систе­мы Linux в ава­рий­ном режиме
  • 2–5 – Обыч­ная мно­го­поль­зо­ва­тель­ская систе­ма, под­дер­жи­ва­ю­щая как CLI, так и GUI, а так­же пол­ную сете­вую связь

Застую дис­три­бу­ти­вы Linux и систе­ма Unix изме­ня­ли эти зна­че­ния уров­ней выпол­не­ния в соот­вет­ствии со сво­и­ми потребностями.

Тем не менее, /etc/rc.local вызы­ва­ет­ся, когда систе­ма вхо­дит в мно­го­поль­зо­ва­тель­ский режим через уров­ни запус­ка от 2 до 5.

Одна­ко это зна­че­ние по умол­ча­нию было уда­ле­но, когда боль­шая часть дис­три­бу­ти­вов Linux пере­клю­чи­лась на systemd.

Поэто­му я напи­сал это крат­кое руко­вод­ство для раз­ра­бот­чи­ков Linux и систем­ных администраторов.

Создать свой собственный сервис легко с systemd на Linux

Вме­сто скрип­та обо­лоч­ки в /etc/rc.d/ или вызо­ва /etc/rc.local мы сде­ла­ем это по другому.

Он рабо­та­ет толь­ко в Linux, но не в дру­гих вари­ан­тах Unix. Тогда про­сто сделайте:

Напри­мер, вот как мы можем уста­но­вить пра­ви­ла Wireguard или openvpn iptables:

А потом:

$ sudo systemctl enable wireguard-iptables.service
$ sudo systemctl start wireguard-iptables.service
$ sudo systemctl stop wireguard-iptables.service