Як запустити скрипт під час завантаження як root


59

У мене був сценарій, який автоматично включає мій wifi без використання networkmanager, але я не знаю, як запустити скрипт як root під час завантаження системи. Як зробити так, щоб сценарій запускався автоматично під час завантаження?


Програми автоматичного запуску налаштовуються в autostartманіфестах або у *.serviceфайлах у кількох місцях, а також у init.dабо crontab. Дивіться це: unix.stackexchange.com/a/525845/43233
Ноам Манос

Відповіді:


54

Розмістіть сценарій, який потрібно запустити, у каталог /etc/init.d і зробіть сценарій виконуваним.

chmod 755 myscript

Як тільки це буде зроблено, створіть символічне посилання в каталозі рівня запуску, який ви хотіли б використовувати, наприклад, якщо ви хочете запустити програму в графічному рівні 2, запущений рівень за замовчуванням для Ubuntu, ви помістите його в /etc/rc2.dкаталог. Ви просто не можете розмістити його в каталозі, ви повинні вказати, коли він буде запущений, вказавши запуск символом "S", і порядок виконання важливий. Розмістіть його після всього іншого, що є в каталозі, давши йому більшу кількість.

Якщо останній запущений сценарій є rc.localі він названий, S99rc.localвам потрібно додати свій сценарій як S99myscript.

ln -s /etc/init.d/myscript /etc/rc3.d/S99myscript

Кожен відсталий сумісний /etc/rc*.dкаталог містить символьні посилання на /etc/init.d/каталог.


1
Зауважте, що під Ubuntu Server 14.04 мені потрібно було використовувати /etc/rc2.dзамість rc3.dзазначеного в прикладі. Здається, rc2.dце не просто графічний рівень запуску.
Бред

1
cd /etc/rc`cat /etc/init/rc-sysinit.conf | grep "env DEFAULT_RUNLEVEL" | grep -oP "\d"`.dпереведе вас до того, який /etc/rc?.dкаталог відповідає вашому рівню запуску за замовчуванням.
Кевін

1
Замість цього: "Якщо останній запущений скрипт є rc.localі він названий, S99rc.localвам потрібно додати свій сценарій як S99myscript.". Ви мали на увазі: "Якщо останній запущений сценарій є myscriptі він названий, S99myscriptто вам слід додати свій сценарій як S99myscript." ???
Др

6
Майте на увазі, що це не буде працювати з systemd (тобто починаючи з Ubuntu 16.04). Дивіться це замість цього.
Олександр Рево

26

Включіть команду в /etc/rc.local. Він буде виконуватися щоразу, коли зміниться рівень запуску користувача.

Примітка: Ви повинні поставити команду перед останнім рядком у /etc/rc.local, який містить: "exit 0".


3
Примітка: ви повинні поставити команду перед останнім рядком, /etc/rc.localщо містить: exit 0
rubo77

3
/etc/rc.localв ubuntu 15.10 в коментарі написано, що "Цей скрипт виконується в кінці кожного багатокористувацького рівня". Отже сценарій можна запустити кілька разів під час завантаження, правда?
jarno

@jamo, так, на кожному рівні запуску. Я не знаю, як це пов’язано із запуском "під час завантаження", що зазвичай означає "запустити один раз під час завантаження".
erm3nda

17

Використовуйте crontabопцію, щоб змусити сценарій запускатися після перезавантаження,

це можна зробити, додавши @rebootкод у cron

Відкрити crontab користувачем root:

$ sudo crontab -e

Додайте наступний запис внизу:

@reboot yourScriptPath 

Це зробить те, що ти хочеш.


Ви мали на увазі використання команди crontab -e, яка не потребує привілеїв суперпользователя? Цікаво, чи може він запускати сценарії, які потрібно запускати як root.
jarno

Я це перевірив. Він не запускає скрипт як root.
jarno

4
Ви повинні додати рядок під час виконання команди, sudo crontab -eщоб змусити її запускати скрипт як root під час запуску.
jarno

не забудьте видалити /var/run/crond.reboot, якщо ні, то завдання не виконає
Альберт Катала

Тільки для запису я впевнений, що @jarno це вже буде знати. Кожен користувач має власне завдання cron, тому якщо ви додасте його до свого користувача (працює crontab -e без судо), сценарій буде виконуватися вашим користувачем. Тому вам потрібно запустити його як root, щоб він міг запускати сценарії як root під час завантаження.
eddieferetro

9

Це працювало для мене на Ubuntu 17.04:

  1. створити файл сценарію туру, як disable_cdromу зручному для вас місці. У моєму випадку home/yterle/disable_cdrom. У моєму випадку:

    #!/bin/sh
    eject /dev/sr0 -i 1
  2. зробити його виконуваним chmod 775 disable_cdrom

  3. перейдіть до /etc/systemd/systemта створіть там serviceфайл. Наприкладsudo gedit /etc/systemd/system/disable_cdrom.service

Моє disable_cdrom.serviceвиглядає так:

[Unit]
Description=Disable cdrom

[Service]
Type=oneshot
ExecStart=/bin/sh /home/yterle/disable_cdrom

[Install]
WantedBy=multi-user.target

Де ExecStartокуляри запускати ваш сценарій/bin/sh

Потім запустіть, systemctl enable disable_cdrom.serviceщоб увімкнути системну службу


1
Голосування за це, як це те, що я шукав, але я думаю, ви маєте на увазіsystemctl enable disable_cdrom.service
KennetRunner

5

Додайте файл Script до /etc/init.d/ дозволу на виконання, а потім встановіть інший рівень запуску

$ update-rc.d script-name default

Він поставить ваш сценарій при запуску завантаження.


Не працює для мене на Kali Linux v2.0. Ви мали на увазі update-rc.d script-name enable?
Sopalajo de Arrierez

update-rc.d <script-name> скрипт оболонки за замовчуванням, який у вас є копія за адресою /etc/init.d/ <script-name>
MS Parmar

4

Створіть такий текстовий файл у /etc/cron.d/:

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

@reboot   root    yourScriptPath

(Вам слід замінити yourScriptPathшлях до сценарію, який потрібно запустити.)


1

Будьте обережні з додаванням сценарію до rc.local- я застряг на екрані заставки. Натискання Alt+ F1виявило, що відбувається за екраном сплеску (сценарій у rc.localвиконанні).

Я не міг вибратися з цього.

  • Ctrl+ Alt+ Delабо
  • Alt+ PrtSc+ Kабо
  • Ctrl+ Alt+F#

нічого не працює.

Мені довелося завантажуватися із зображення USB USB Ubuntu, знайти rc.local, дати собі дозволи на файл та видалення. Я думаю, вам не слід робити речі, якщо ви не знаєте, що робите.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.