So führen Sie ein Skript beim Booten als root aus

59

Ich hatte ein Skript, das mein WLAN automatisch aktiviert, ohne den Netzwerkmanager zu verwenden, aber ich weiß nicht, wie ich das Skript als Root ausführen soll, während das System bootet. Wie kann ich das Skript beim Booten automatisch ausführen lassen?

user128712
quelle
Autostart-Programme werden in autostartManifesten oder in *.serviceDateien an mehreren Speicherorten sowie in init.doder konfiguriert crontab. Siehe dies: unix.stackexchange.com/a/525845/43233
Noam Manos

Antworten:

54

Platzieren Sie das Skript, das Sie ausführen möchten, im Verzeichnis /etc/init.d und machen Sie das Skript ausführbar.

chmod 755 myscript

Sobald dies erledigt ist, erstellen Sie einen symbolischen Link in dem Runlevel-Verzeichnis, das Sie verwenden möchten. Wenn Sie beispielsweise ein Programm in dem grafischen Runlevel 2, dem Standard-Runlevel für Ubuntu, ausführen möchten, platzieren Sie es in dem /etc/rc2.dVerzeichnis. Sie können es einfach nicht in das Verzeichnis stellen. Sie müssen angeben, wann es ausgeführt wird, indem Sie den Start mit einem "S" kennzeichnen und die Ausführungsreihenfolge ist wichtig. Platzieren Sie es nach allem anderen, was sich im Verzeichnis befindet, indem Sie ihm eine höhere Nummer geben.

Wenn das letzte auszuführende Skript rc.localbenannt S99rc.localist, müssen Sie es als hinzufügen S99myscript.

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

Jedes abwärtskompatible /etc/rc*.dVerzeichnis verfügt über symbolische Links zu dem /etc/init.d/Verzeichnis.

Radu Rădeanu
quelle
1
Beachten Sie, dass ich unter Ubuntu Server 14.04 verwenden musste /etc/rc2.d, anstatt rc3.dwie im Beispiel angegeben. Es scheint rc2.dnicht nur das grafische Runlevel zu sein.
Brad
1
cd /etc/rc`cat /etc/init/rc-sysinit.conf | grep "env DEFAULT_RUNLEVEL" | grep -oP "\d"`.dHiermit gelangen Sie in das /etc/rc?.dVerzeichnis, das Ihrem Standard-Runlevel entspricht.
Kevin
1
Stattdessen: "Wenn das letzte auszuführende Skript den rc.localNamen trägt S99rc.local, müssen Sie Ihr Skript als S99myscript. Hinzufügen ." Meinten Sie: "Wenn das letzte auszuführende Skript einen myscriptNamen S99myscripthat, müssen Sie Ihr Skript als hinzufügen S99myscript." ???
Dor
6
Beachten Sie, dass dies mit systemd nicht funktioniert (dh ab Ubuntu 16.04). Sehen Sie dies stattdessen.
Alexander Revo
26

Fügen Sie den Befehl ein /etc/rc.local. Es wird ausgeführt, wenn sich der Runlevel des Benutzers ändert.

Hinweis: Sie müssen den Befehl vor die letzte Zeile in /etc/rc.local setzen, die Folgendes enthält: "exit 0".

thefourtheye
quelle
3
Hinweis: Sie müssen den Befehl vor die letzte Zeile setzen /etc/rc.local, die exit 0
Folgendes
3
/etc/rc.localIn Ubuntu 15.10 heißt es im Kommentar: "Dieses Skript wird am Ende jedes Mehrbenutzer-Runlevels ausgeführt." Das Skript könnte also während des Startvorgangs mehrmals ausgeführt werden, oder?
jarno
@jamo, ja, auf jedem Runlevel. Ich weiß nicht, wie dies mit "beim Booten" zusammenhängt, was normalerweise "einmal beim Booten starten" bedeutet.
erm3nda
17

Verwenden Sie eine crontabOption, damit Ihr Skript nach dem Neustart ausgeführt wird.

Sie können dies tun, indem Sie @rebootCode in cron hinzufügen

Öffnen Sie crontab vom root-Benutzer:

$ sudo crontab -e

Fügen Sie den nächsten Datensatz unten hinzu:

@reboot yourScriptPath 

Das wird machen was du willst.

hs.chandra
quelle
Meinten Sie befehl verwenden crontab -e, für den keine Superuser-Berechtigungen erforderlich sind? Ich frage mich, ob es Skripte ausführen kann, die als root ausgeführt werden müssen.
jarno
Ich habe das getestet. Das Skript wird nicht als root ausgeführt.
jarno
4
Sie müssen die Zeile beim Ausführen des Befehls hinzufügen sudo crontab -e, damit das Skript beim Start als root ausgeführt wird.
Jarno
Vergessen Sie nicht, zu entfernen /var/run/crond.reboot, wenn nicht, wird die Aufgabe nicht ausgeführt
Albert Català
Nur fürs Protokoll, ich bin sicher, dass @jarno es bereits wissen wird. Jeder Benutzer hat seine eigene Cron-Aufgabe. Wenn Sie sie also zu der Aufgabe Ihres Benutzers hinzufügen (crontab -e ohne sudo ausführen), wird das Skript von Ihrem Benutzer ausgeführt. Sie müssen es also als root ausführen, damit Skripte beim Booten als root ausgeführt werden können.
Eddieferetro
9

Das hat bei mir unter Ubuntu 17.04 geklappt:

  1. Erstellen Sie eine Tour-Skriptdatei wie disable_cdromin Ihrem gewünschten Verzeichnis. In meinem Fall home/yterle/disable_cdrom. In meinem Fall:

    #!/bin/sh
    eject /dev/sr0 -i 1
  2. mach es ausführbar chmod 775 disable_cdrom

  3. navigiere zu /etc/systemd/systemund erstelle dort eine servicedatei. Zum Beispielsudo gedit /etc/systemd/system/disable_cdrom.service

Mein disable_cdrom.servicesieht so aus:

[Unit]
Description=Disable cdrom

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

[Install]
WantedBy=multi-user.target

Wo ExecStartsoll das Skript ausgeführt werden?/bin/sh

Führen Sie dann aus systemctl enable disable_cdrom.service, um den systemd-Dienst zu aktivieren

YTerle
quelle
1
Ich systemctl enable disable_cdrom.service
stimme dem zu
5

Fügen Sie Ihre Skriptdatei /etc/init.d/ mit der Berechtigung Ausführbare Datei hinzu, und legen Sie dann eine andere Ausführungsebene fest

$ update-rc.d script-name default

Es wird Ihr Skript beim Booten starten.

MS Parmar
quelle
Funktioniert bei mir nicht unter Kali Linux v2.0. Meinten Sie update-rc.d script-name enable?
Sopalajo de Arrierez
update-rc.d <Skriptname> Standard-Shell-Skript, das Sie unter /etc/init.d/ <Skriptname> kopieren können
MS Parmar
4

Erstellen Sie eine Textdatei wie diese in /etc/cron.d/:

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

@reboot   root    yourScriptPath

(Sie sollten yourScriptPathden Pfad zu dem Skript angeben, das Sie ausführen möchten.)

jarno
quelle
1

Vorsicht beim Hinzufügen des Skripts zu rc.local- ich war deswegen im Begrüßungsbildschirm stecken. Durch Drücken von Alt+ F1wurde angezeigt, was sich hinter dem Begrüßungsbildschirm abspielte (das Skript rc.localwurde ausgeführt).

Ich konnte nicht raus.

  • Ctrl+ Alt+ Deloder
  • Alt+ PrtSc+ Koder
  • Ctrl+ Alt+F#

nichts funktioniert.

Ich musste von einem USB-Ubuntu-Image booten, suchen rc.local, mir die Erlaubnis geben, es abzulegen und zu löschen. Ich denke, du solltest nichts tun, wenn du nicht weißt, was du tust.

Gašper Čefarin
quelle