Как запустить скрипт во время загрузки как root


59

У меня был скрипт, который автоматически включал мой Wi-Fi без использования сетевого менеджера, но я не знаю, как запустить скрипт от имени пользователя 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 14.10.14

3
/etc/rc.localВ Ubuntu 15.10 есть комментарий, что «Этот скрипт выполняется в конце каждого многопользовательского уровня запуска». Так что скрипт может быть запущен несколько раз во время загрузки, верно?
Ярно

@jamo, да, на каждом уровне выполнения. Я не знаю, как это связано с выполнением «при загрузке», что обычно означает «запускать один раз при загрузке».
erm3nda

17

Используйте crontabопцию, чтобы ваш скрипт запускался после перезагрузки,

Вы можете сделать это, добавив @rebootкод в cron

Откройте crontab пользователем root:

$ sudo crontab -e

Добавьте следующую запись внизу:

@reboot yourScriptPath 

Это будет делать то, что вы хотите.


Вы crontab -eимели в виду использование команды , которая не требует привилегий суперпользователя? Интересно, может ли он запускать скрипты, которые нужно запускать с правами root.
Ярно

Я проверял это. Он не запускает скрипт от имени пользователя root.
Ярно

4
Вы должны добавить строку во время выполнения команды, sudo crontab -eчтобы он запускал скрипт от имени root во время запуска.
Ярно

не забудьте удалить /var/run/crond.reboot, если нет, не будет выполнять задачу
Альберт Катала

Я уверен, что @jarno узнает об этом только для записи. У каждого пользователя есть своя собственная задача cron, поэтому, если вы добавите ее к своей задаче (запустив crontab -e без sudo), скрипт будет запускаться вашим пользователем. Поэтому вам нужно запустить его как 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чтобы включить службу systemd


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?
Сопалахо де Арриес

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 Ubuntu, найти rc.local, дать себе разрешения на файл и удалить его. Я думаю, что вы не должны делать вещи, если вы не знаете, что делаете.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.