Jak uruchomić skrypt podczas rozruchu jako root


59

Miałem skrypt, który automatycznie włącza moje Wi-Fi bez korzystania z menedżera sieci, ale nie wiem, jak uruchomić skrypt jako root podczas uruchamiania systemu. Jak ustawić automatyczne uruchamianie skryptu podczas uruchamiania?


Programy autostartu są konfigurowane w autostartmanifestach lub w *.serviceplikach w kilku lokalizacjach, a także w init.dlub crontab. Zobacz: unix.stackexchange.com/a/525845/43233
— Noam Manos

Odpowiedzi:


54

Umieść skrypt, który chcesz uruchomić, w katalogu /etc/init.d i spraw, aby skrypt był wykonywalny.

chmod 755 myscript

Gdy to zrobisz, utwórz dowiązanie symboliczne w katalogu poziomu uruchamiania, którego chcesz użyć, na przykład, jeśli chcesz uruchomić program na graficznym poziomie pracy 2, domyślnym poziomie uruchamiania dla Ubuntu, umieścisz go w /etc/rc2.dkatalogu. Po prostu nie możesz umieścić go w katalogu, musisz zaznaczyć, kiedy się uruchomi, wskazując uruchomienie za pomocą „S”, a kolejność wykonywania jest ważna. Umieść go po wszystkim innym, co jest w katalogu, nadając mu wyższy numer.

Jeśli ostatnim skryptem, który ma zostać uruchomiony, jest rc.localjego nazwa S99rc.local, należy dodać skrypt jako S99myscript.

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

Każdy kompatybilny wstecz /etc/rc*.dkatalog ma dowiązania symboliczne do /etc/init.d/katalogu.


1
Zauważ, że w Ubuntu Server 14.04 musiałem użyć /etc/rc2.dzamiast tego, rc3.djak wskazano w przykładzie. Wygląda na rc2.dto, że nie jest to tylko poziom graficzny.
— Brad

1
cd /etc/rc`cat /etc/init/rc-sysinit.conf | grep "env DEFAULT_RUNLEVEL" | grep -oP "\d"`.dprzeniesie Cię do /etc/rc?.dkatalogu, który odpowiada domyślnemu poziomowi działania.
— Kevin

1
Zamiast tego: „Jeśli ostatnim skryptem, który ma być uruchomiony, jest rc.locali jest nazwany S99rc.local, musisz dodać swój skrypt jako S99myscript.”. Czy miałeś na myśli: „Jeśli ostatnim skryptem do uruchomienia jest myscripti jest on nazwany S99myscript, musisz dodać swój skrypt jako S99myscript.” ???
— Dor

6
Należy pamiętać, że nie będzie to działać z systememd (tj. Począwszy od Ubuntu 16.04). Zobacz to zamiast tego .
— Alexander Revo

26

Uwzględnij polecenie w /etc/rc.local. Będzie uruchamiany przy każdej zmianie poziomu uruchamiania użytkownika.

Uwaga: Musisz umieścić polecenie przed ostatnim wierszem w /etc/rc.local, który zawiera: „exit 0”.


3
Uwaga: musisz umieścić polecenie przed ostatnim wierszem, /etc/rc.localktóry zawiera: exit 0
— rubo77

3
/etc/rc.localw Ubuntu 15.10 ma w komentarzu, że „Ten skrypt jest wykonywany na końcu każdego poziomu uruchamiania dla wielu użytkowników”. Więc skrypt może być uruchamiany kilka razy podczas rozruchu, prawda?
— jarno

@jamo, tak, na każdym poziomie pracy. Nie wiem, jak to się ma do uruchomienia „przy starcie”, co zwykle oznacza „uruchom raz przy starcie”.
— erm3nda

17

Użyj crontabopcji, aby skrypt był uruchamiany po ponownym uruchomieniu,

możesz to zrobić, dodając @rebootkod do crona

Otwórz crontab przez użytkownika root:

$ sudo crontab -e

Dodaj następny rekord na dole:

@reboot yourScriptPath 

To zrobi, co chcesz.


Czy chodziło Ci o użycie polecenia crontab -e, które nie wymaga uprawnień administratora? Zastanawiam się, czy może uruchamiać skrypty, które muszą być uruchamiane jako root.
— jarno

Przetestowałem to. Nie uruchamia skryptu jako root.
— jarno

4
Musisz dodać linię podczas uruchamiania polecenia, sudo crontab -eaby uruchomić skrypt jako root podczas uruchamiania.
— jarno

nie zapomnij usunąć /var/run/crond.reboot, jeśli nie, nie wykona zadania
— Albert Català

Tylko dla przypomnienia, jestem pewien, że @jarno już to wie. Każdy użytkownik ma swoje własne zadanie cron, więc jeśli dodasz je do swojego (zadanie crontab -e bez sudo), skrypt zostanie uruchomiony przez użytkownika. Musisz więc uruchomić go jako root, aby móc uruchamiać skrypty jako root podczas rozruchu.
— eddieferetro

9

To działało dla mnie w Ubuntu 17.04:

  1. utwórz plik skryptu trasy jak disable_cdromw dogodnej dla Ciebie lokalizacji. W moim przypadku home/yterle/disable_cdrom. W moim przypadku:

    #!/bin/sh
    eject /dev/sr0 -i 1
  2. sprawiają, że jest wykonywalny chmod 775 disable_cdrom

  3. przejdź do /etc/systemd/systemi utwórz tam serviceplik. Na przykładsudo gedit /etc/systemd/system/disable_cdrom.service

Mój disable_cdrom.servicewygląda tak:

[Unit]
Description=Disable cdrom

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

[Install]
WantedBy=multi-user.target

Gdzie ExecStartpunkty, z którymi należy uruchomić skrypt/bin/sh

Następnie uruchom, systemctl enable disable_cdrom.serviceaby włączyć usługę systemd


1
Głosowałem, bo tego właśnie szukałem, ale myślę, że masz na myślisystemctl enable disable_cdrom.service
— KennetRunner,

5

Dołącz swój plik skryptu /etc/init.d/ z uprawnieniem do wykonywania, a następnie ustaw inny poziom uruchamiania

$ update-rc.d script-name default

Spowoduje to uruchomienie skryptu podczas uruchamiania systemu.


Nie działa dla mnie w Kali Linux v2.0. Miałeś na myśli update-rc.d script-name enable?
— Sopalajo de Arrierez

update-rc.d <nazwa skryptu> domyślny skrypt powłoki, który masz skopiowany na /etc/init.d/ <nazwa skryptu>
— MS Parmar

4

Utwórz taki plik tekstowy w /etc/cron.d/:

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

@reboot   root    yourScriptPath

(Należy zastąpić yourScriptPathścieżką do skryptu, który chcesz uruchomić).


1

Ostrożnie dodając skrypt do rc.local- Utknąłem z tego powodu na ekranie powitalnym. Naciśnięcie Alt+ F1ujawniło, co działo się za ekranem powitalnym (uruchomiony skrypt rc.local).

Nie mogłem się z tego wydostać.

  • Ctrl+ Alt+ Dellub
  • Alt+ PrtSc+ Klub
  • Ctrl+ Alt+F#

nic nie działa.

Musiałem uruchomić z obrazu Ubuntu USB, znaleźć rc.local, dać sobie uprawnienia do pliku i usunąć go. Myślę, że nie powinieneś robić rzeczy, jeśli nie wiesz, co robisz.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.