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?

użytkownik128712
źródło
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.

Radu Rădeanu
źródło
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”.

thefourtheye
źródło
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.

hs.chandra
źródło
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

YTerle
źródło
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.

MS Parmar
źródło
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ć).

jarno
źródło
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.

Gašper Čefarin
źródło