Wie führe ich Skripte beim Start aus?

520

Wie kann ich Skripte automatisch ausführen, wenn Ubuntu gestartet wird, damit ich sie nach dem Start nicht manuell ausführen muss?

myusuf3
quelle
3
Wenn jemand auch WANN und WO zeigen könnte, wäre das großartig. Ich sage das, weil ich weiß, dass es mindestens zwei Möglichkeiten gibt, ein Skript zu starten, das
ausgelöst
1
Dieser gesamte Antwort-Thread ist ein Chaos. Das Stack Exchange-Format scheint für diese Frage nicht am besten geeignet zu sein
Gabriel Fair
1
Es ist eigentlich ziemlich unterhaltsam. Wie viele verschiedene Möglichkeiten könnte es geben?
Devios1

Antworten:

206

Abhängig davon, welche Art von Skripten Sie ausführen müssen. Für Dienste und dergleichen sollten Sie upstart verwenden . Aber für ein Benutzerskript sollten diese von gnome als Sitzungsskripte gestartet werden! Schauen Sie unter System> Preferences> Startup Applications nach.

Nebenbei bemerkt, wenn Sie einige Skripts für die Terminalanmeldung benötigen, können Sie diese der Datei .bash_login in Ihrem Ausgangsverzeichnis hinzufügen .

Für 14.04 und älter

Ein einfacher Befehl (der nicht ausgeführt werden muss) könnte einen Upstart-Job wie den folgenden verwenden:

start on startup
task
exec /path/to/command

Speichern Sie diese in einer .confDatei in /etc/init(wenn Sie es brauchen als root ausführen , wenn das System bootet) oder ~/.config/upstart(wenn Sie es als Benutzer ausgeführt werden, wenn Sie sich anmelden).

LassePoulsen
quelle
58
Könnten Sie in Anbetracht der Funktionsweise von SO und StackExchange ein Beispiel für ein Startskript geben und wo es platziert werden würde? Das würde dies zu einer viel besseren Antwort machen. Dein Link sagt, dass es nicht gepflegt wird und das Kochbuch zu lesen, das riesig ist. Ich habe keine Ahnung, wo ich anfangen soll.
Ehtesh Choudhury
2
Was ist, wenn ich den Befehl als root ausführen muss?
Dopatraman
1
@dopatraman Die Antwort besagt, dass alle Prozesse mit diesem Namen als root ausgeführt werden.
AStopher
4
Bitte aktualisieren Sie diese Antwort, um zu erklären, was auf Systemen zu tun ist, auf denen systemd und nicht upstart ausgeführt wird (Ubuntu 15.04+).
3
Diese Antwort ergibt für mich keinen Sinn. Die in aufgeführten Anwendungen system->pref->startup applicationssind weder in /etc/init/noch in zu finden ~/.config/upstart. So wo Start - Anwendungen definiert?
Blauhirn
553

Ein Ansatz ist das Hinzufügen einer @ Reboot- Cron- Task:

  1. Mit Running crontab -ekönnen Sie Ihren Cron bearbeiten.
  2. Eine Zeile wie diese hinzufügen:

    @reboot /path/to/script
    

    Führt dieses Skript aus, sobald Ihr Computer hochfährt.

ceejayoz
quelle
85
Das @rebootSchlüsselwort ist ein guter Tipp, da es nicht allgemein bekannt ist.
Jathanismus
12
Nett. Irgendeine Idee genau wann dies auslöst?
Oli
2
Also ... würde dies nicht funktionieren, wenn ich die Stromversorgung verlieren und den PC nach Wiederherstellung der Stromversorgung wieder einschalten würde?
Mike Wills
18
@siamii: man 5 crontabsagt, dass dies @rebootbeim Start ausgeführt wird (wenn der Cron-Daemon gestartet wird).
jfs
9
Das ist fantastisch. Bisher scheint dies besser zu sein, als rc.localweil das System zu diesem Zeitpunkt mehr eingerichtet zu sein scheint (PATH usw.). Es ist seltsam, dass es so schwer ist, nach dem Systemstart etwas aufzurufen .
Karthik T
161

Wie wäre es, wenn Sie den Befehl hinzufügen /etc/rc.local? Sie müssen jedoch sudo-Zugriff verwenden, um diese Datei zu bearbeiten.

sudo nano /etc/rc.local
Paolo Granada Lim
quelle
19
Dies beantwortet direkt die Frage, wie Sie einfach einige Skripte ausführen, wenn Ihr System startet. upstart führt eine komplexere Aufgabe aus: Startet Daemon-Prozesse.
Dogweather
1
Also startet upstart Daemon-Prozesse, während /etc/rc.local Bash-Skripte startet?
Donato
5
Sollte es? Das funktioniert heutzutage nicht mehr, oder?
DaVince
4
Arbeite nicht mit Ubuntu 17.04 systemd
qodeninja
3
Beachten Sie, dass Sie, wenn Sie diese Datei selbst erstellen (wie ich), die Datei in "ausführbar mit" ändern chmod 755 rc.localund #!/bin/bashin die erste Zeile einfügen müssen.
Lebenslauf
77

Für 15.04 und später:

Um einen (kurzlebigen) Befehl 1 beim Start mit auszuführen systemd, können Sie eine systemd-Einheit des Typs verwenden OneShot. Erstellen Sie beispielsweise /etc/systemd/system/foo.serviceFolgendes:

[Unit]
Description=Job that runs your user script

[Service]
ExecStart=/some/command
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Dann renne:

sudo systemctl daemon-reload
sudo systemctl enable foo.service

Im Wesentlichen konvertiert dies nur einen typischen Upstart-Job in einen systemd- Job (siehe Systemd für Upstart-Benutzer ).

Sie können mehrere Befehle aus derselben Servicedatei in mehreren ExecStartZeilen ausführen :

[Service]
ExecStart=/some/command
ExecStart=/another/command some args
ExecStart=-/a/third/command ignore failure

Der Befehl muss immer mit dem vollständigen Pfad angegeben werden. Wenn ein Befehl fehlschlägt, wird der Rest nicht ausgeführt. A -vor dem Pfad weist systemd an, einen Exit-Status ungleich Null zu ignorieren (anstatt ihn als Fehler zu betrachten).

Relevant:


Für Benutzersitzungen können Sie ~/.config/systemdstattdessen die Systemeinheit in erstellen . Dies sollte ab 16.04 funktionieren, jedoch nicht mit früheren Versionen von Ubuntu mit systemd (da diese noch Upstart für Benutzersitzungen verwendeten). Benutzersitzungseinheiten können mit den gleichen Befehlen wie bei Systemdiensten gesteuert werden, jedoch mit der --userhinzugefügten Option:

systemctl --user daemon-reload
systemctl --user status foo.service

Shell-Syntax

Beachten Sie, dass systemd im Gegensatz zu Upstart die Exec*Befehle nicht über eine Shell ausführt. Es führt eine begrenzte Variablenerweiterung und mehrere (durch ;) getrennte Befehle aus , aber das war es auch schon, was die Shell-ähnliche Syntax betrifft. Wenn Sie etwas Komplizierteres wünschen, z. B. Umleitung oder Pipes, schließen Sie Ihren Befehl in sh -c '...'oder ein bash -c '...'.


1 Im Gegensatz zu langlebigen Dämonen.

muru
quelle
Ist es möglich, eine Priorität für den Job festzulegen? oder angeben, dass es von einem anderen Dienst abhängt, der zuerst gestartet wird?
R3WT
1
@ r3wt ja, dazu gibt es verschiedene möglichkeiten. Das WantedByhier verwendete bewirkt beispielsweise, dass es startet, wenn das multi-user.targeterreicht ist. Sie können verwendet werden Before, After, Requiresusw. Sieheman systemd.unit
muru
@PerlDuck hat nicht nur gefehlt. Vielen Dank!
muru
Bitte. - Übrigens RemainAfterExithängt das von dem Dienst ab, den Sie starten, und seinem gewünschten Verhalten. Zum Beispiel sollte /bin/df -h<s> haben </ s> RemainAfterExit=no.
PerlDuck
@PerlDuck Es gibt nichts inhärent dfdas braucht RemainAfterExit=no. Es sei denn, Sie möchten den Befehl bei jeder Ausführung wiederholt ausführen systemctl start foo.
muru
71

Es gibt verschiedene Möglichkeiten, Befehle automatisch auszuführen:

  1. Das Upstart- System führt alle Skripte aus, von denen es eine Konfiguration im Verzeichnis findet /etc/init. Diese Skripte werden während des Systemstarts (oder als Reaktion auf bestimmte Ereignisse, z. B. eine Anforderung zum Herunterfahren) ausgeführt und sind daher der Ort, an dem Befehle ausgeführt werden, die nicht mit dem Benutzer interagieren. Alle Server werden mit diesem Mechanismus gestartet.

    Eine lesbare Einführung finden Sie auf: http://upstart.ubuntu.com/getting-started.html den Manpages man 5 initund man 8 initgeben Ihnen die vollständigen Details.

  2. .gnomercJedes Mal, wenn Sie sich bei einer GNOME-Sitzung anmelden, wird automatisch ein Shell-Skript in Ihrem Ausgangsverzeichnis aufgerufen. Sie können dort beliebige Befehle eingeben. Umgebungsvariablen, die Sie in diesem Skript festlegen, werden von jedem Programm angezeigt, das Sie in Ihrer Sitzung ausführen.

    Beachten Sie, dass die Sitzung erst startet, wenn das .gnomercSkript beendet ist. Wenn Sie daher ein Programm mit langer Laufzeit automatisch starten möchten, müssen Sie es &an den Programmaufruf anhängen , um es von der laufenden Shell zu trennen.

  3. Über die Menüoption System -> Einstellungen -> Startanwendungen können Sie festlegen, welche Anwendungen beim Start Ihrer grafischen Sitzung gestartet werden sollen (Ubuntu definiert einige davon vor) und diese nach Ihrem Geschmack hinzufügen oder entfernen. Dies hat fast den gleichen Zweck und Umfang des .gnomercSkripts, außer dass Sie die shSyntax nicht kennen müssen (aber Sie können auch kein shProgrammierkonstrukt verwenden).

Riccardo Murri
quelle
11
3) "Dies hat fast den gleichen Zweck und Umfang wie das .gnomerc-Skript", außer dass es .gnomercanscheinend vor dem Laden von Unity und Startup Applicationsanscheinend nach dem Laden von Unity ausgeführt wird. Ich musste ein Programm ausführen, das sich in der Unity-Menüleiste befindet, und das hat in diesem Fall einen großen Unterschied gemacht!
Der Brasilianer
1
@ ruda.almeida Danke für den Hinweis. Die Antwort wurde in den Tagen vor der Einheit geschrieben.
Riccardo Murri
1
sudo update-rc.d myscript.sh defaultsWenn /etc/init.d/myscript.sh Ihr Skript ist, wird es auch beim Start ausgeführt.
Dan Dascalescu
27
$HOME/.config/autostart
  • Dieser Speicherort enthält die Liste der Startanwendungen.
  • .desktop Hier kann eine Datei abgelegt werden, die beim Start ausgeführt wird.

Beispiel für eine .desktopDatei:

Folgende .desktopDatei einfügen $HOME/.config/autostartund übergeben chmod +x:

[Desktop Entry]
Type=Application
Exec="</path/to/script>"
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name=Startup Script

Hier "</path/to/script>"wird mit Pfad zu Ihrem ersetzt script.sh
( in der Regel empfohlen, /usr/local/binso dass durch direkt sagen Befehl ausgeführt werden kann myscriptersetzt mit "</path/to/script>").

Beispielbeispiel von script.sh:

#!/bin/bash
<commands to be executed>
exit

Ergebnis: Die .desktopDatei wird gestartet, von $HOME/.config/autostartder aus das Skript ausgeführt wirdExec=

Daher können Sie Ihr gewünschtes Shell-Skript beim Start ausführen!

Pandya
quelle
18

Für einfache Dinge können Sie unter System-> Einstellungen-> Sitzungen einen Befehl hinzufügen , der auf den Speicherort Ihres Skripts verweist.

Alternativ können Sie es zu /etc/init.d/rc.local hinzufügen oder einen Upstart- Job ausführen, wenn es sich um ein Zeug auf niedrigerer Ebene handelt .

Weitere Informationen finden Sie unter https://help.ubuntu.com/community/UbuntuBootupHowto

tutuca
quelle
7

cron Antwort implementiert anders als oben gewählt

Diese Antwort verwendet immer noch croneine andere Methode als die Antwort mit der höchsten Bewertung. Dies funktioniert seit Ubuntu 16.04, wird aber wahrscheinlich viel früher unterstützt. Es ist nur so, dass ich angefangen habe cron, Jobs auszuführen, als der Computer seit dem 16.04 hochgefahren ist.

Wann läuft cron?

In Kommentaren fragte jemand "Wann laufen sie?". Sie können in Syslog / Journalctl sagen:

$ journalctl -b | grep cron
Jan 02 16:54:40 alien cron[919]: (CRON) INFO (pidfile fd = 3)
Jan 02 16:54:40 alien cron[919]: (CRON) INFO (Running @reboot jobs)
Jan 02 16:54:40 alien systemd[1]: Started Run anacron jobs.
Jan 02 16:54:40 alien anacron[949]: Anacron 2.3 started on 2018-01-02
Jan 02 16:54:40 alien anacron[949]: Normal exit (0 jobs run)
Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[954]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[951]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[985]: (root) CMD (   /usr/local/bin/cron-reboot-cycle-grub-background)
Jan 02 16:54:40 alien CRON[954]: pam_unix(cron:session): session closed for user root
Jan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587
Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session closed for user root
Jan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587
Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): session closed for user root

Zu beachten ist , dass Sie per E- cronMail den Status der ausgeführten Jobs und der ausgeführten @rebootJobs erhalten können, sodass Netzwerkmanager und E-Mail erst ausgeführt werden, wenn Sie einen sleepBefehl in Ihre Skripts eingeben.

Wo sollen die Skripte abgelegt werden?

Legen Sie Ihre Skripte in das Verzeichnis /etc/cron.d:

$ ll /etc/cron.d
total 44
drwxr-xr-x   2 root root  4096 Nov 26 19:53 ./
drwxr-xr-x 139 root root 12288 Dec 31 13:58 ../
-rw-r--r--   1 root root   244 Dec 28  2014 anacron
-rw-r--r--   1 root root   148 Feb 18  2017 cycle-grub-background
-rw-r--r--   1 root root   138 Mar  5  2017 display-auto-brightness
-rw-r--r--   1 root root   460 Nov 26 19:53 nvidia-hdmi-sound
-rw-r--r--   1 root root   102 Feb  9  2013 .placeholder
-rw-r--r--   1 root root   224 Nov 19  2016 touch-vmlinuz
-rw-r--r--   1 root root   700 Aug  5 11:15 turn-off-hyper-threading

Wie sieht ein Skript aus?

Hier sind ein paar Skripte, die ich eingerichtet habe, um jeden Start auszuführen:

$ cat /etc/cron.d/cycle-grub-background SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 
@reboot   root    /usr/local/bin/cron-reboot-cycle-grub-background

$ cat /etc/cron.d/touch-vmlinuz
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
@reboot   root    touch "/boot/vmlinuz-"`uname -r`
WinEunuuchs2Unix
quelle
1
Es gibt viele verschiedene Möglichkeiten, Cronjobs hinzuzufügen, aber der Kern der hoch bewerteten Antwort und Ihre Antwort ist immer noch die @reboot.
Muru
Alternative Methoden zum Hinzufügen von Crontabs sollten unter askubuntu.com/q/2368/158442 veröffentlicht werden , in dem explizit das Hinzufügen von Cron-Jobs behandelt wird.
Muru
1
Ich bin anderer Ansicht. Der Kern der fraglichen Antwort besteht darin, crontab -edass einige aufgrund einer vim-artigen Benutzeroberfläche als eine der schwarzen Künste gelten. Auf der anderen Seite könnte diese Antwort diejenigen ansprechen, deren Gehirn auf eine bestimmte Weise verdrahtet ist. Wir sind nicht alle aus der gleichen Form gegossen. Andererseits hat diese Antwort bereits eine Ablehnung, sodass die Demokratie ihren Kurs einschlagen kann.
WinEunuuchs2Unix
2
Oh bitte. Sie und ich wissen beide, dass der Editor geändert werden kann.
Muru
@muru Ja, wahrscheinlich, weil du mich unterrichtet hast und ich gelernt habe, den Editor auf etwas wie Nano oder ein paar andere CLIs umzustellen. Aber ich bin im Gedit-Lager. Außerdem crontab -ewerden Erinnerungen an Sternchen ("*") für Minuten, Stunden usw. angezeigt, für die ich immer gefunden habe, dass ich Google-Anweisungen benötige. Ich finde immer noch Verwendung /etc/cron.dund /etc/cron.dailymeine Wahl. Zumal es spiegelt /etc/udev/rules.dund /etc/systemd/system-sleepMethoden. Es scheint einfach eine gute Passform zu sein.
WinEunuuchs2Unix
5

Sie sollten dazu upstart verwenden . Upstart wird für Ubuntu-Prozesse verwendet, die automatisch gestartet werden. Es ist eine erweiterte Lösung wie die alten System-V-init.d-Skripte. Sie können damit auch die Voraussetzungen für den Start Ihres Skripts festlegen (dh, muss das Netzwerk ausgeführt werden? Usw.).

txwikinger
quelle