Frage Wie starte ich Skripte beim Start?


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


456
2017-08-04 19:54


Ursprung


Wenn jemand auch WANN und WO zeigen könnte, wäre das großartig. Ich sage das, weil ich weiß, dass es mindestens 2 Möglichkeiten gibt, ein Skript zu starten, das ausgelöst wird, bevor andere Anwendungen gestartet wurden (wie X11) - Buttink
Dieser ganze Antwortfaden ist ein Durcheinander. Das Stack Exchange-Format scheint für diese Frage nicht am besten geeignet zu sein - Gabriel Fair
Es ist eigentlich ziemlich unterhaltsam. Wie viele verschiedene Wege könnte es geben? - devios1


Antworten:


Abhängig davon, welche Art von Skripten Sie ausführen müssen. Für Dienste und ähnliches sollten Sie verwenden Emporkömmling. Aber für ein Benutzerskript sollten diese als Sitzungsskripte von gnome gestartet werden! Sehen Sie unter System> Einstellungen> Startup-Anwendungen nach.

Nebenbei bemerkt, wenn Sie einige Skripte benötigen, die bei der Terminalanmeldung ausgeführt werden sollen, können Sie diese zu den .bash_login Datei in Ihrem Home-Verzeichnis.

Für 14.04 und älter

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

start on startup
task
exec /path/to/command

Speichern Sie dies in einem .conf Datei in /etc/init (wenn sie beim Booten des Systems als root ausgeführt werden soll) oder in ~/.config/upstart (wenn du es brauchst um als Benutzer zu laufen, wenn Sie sich einloggen).


191
2017-08-04 23:26



In Anbetracht dessen, wie SO und StackExchange ausgeführt werden, könnten Sie ein Beispiel für ein Emporkömmlingskript geben und angeben, wo es platziert werden soll? Das würde eine viel bessere Antwort geben. Dein Link sagt, dass es nicht gepflegt wird und schau dir das Emporkömmlings-Kochbuch an, das ist huuge. Ich habe keine Ahnung, wo ich anfangen soll. - Ehtesh Choudhury
Was ist, wenn ich den Befehl als root ausführen muss? - dopatraman
@doptraman Die Antwort besagt, dass alle Prozesse mit diesem als root ausgeführt werden. - cybermonkey
Bitte aktualisieren Sie diese Antwort, um zu erklären, was auf Systemen zu tun ist, auf denen Systemd statt Upstart läuft (Ubuntu 15.04+).
Diese Antwort ergibt für mich keinen Sinn. Die Anwendungen aufgelistet in system->pref->startup applications kann nicht gefunden werden in /etc/init/ noch nicht ~/.config/upstart. Damit Wo sind Startup-Anwendungen definiert? - Blauhirn


Ein Ansatz besteht darin, ein @ Reboot hinzuzufügen Cron Aufgabe:

  1. Laufen crontab -e ermöglicht es Ihnen, Ihren Cron zu bearbeiten.
  2. Eine Zeile wie folgt hinzufügen:

    @reboot /path/to/script
    

    führt das Skript aus, sobald der Computer hochgefahren ist.


476
2017-08-04 19:57



Das @reboot Stichwort ist ein schöner Tipp, weil es nicht allgemein bekannt ist. - jathanism
Nett. Irgendeine Idee Genau wann das löst aus? - Oli♦
Also ... würde das nicht laufen, wenn ich die Stromversorgung verliere und der PC sich wieder dreht, wenn die Stromversorgung wiederhergestellt ist? - Mike Wills
@siamii: man 5 crontab sagt, dass @reboot wird beim Start ausgeführt (wenn Cron-Daemon gestartet wird). - jfs
Das ist fantastisch. Bis jetzt scheint das besser als rc.local da das System ab diesem Zeitpunkt mehr eingerichtet zu sein scheint (PATH usw.). Es ist merkwürdig, dass es so schwer ist, etwas zu nennen nach Systemstart .. - Karthik T


Wie wäre es mit dem Hinzufügen des Befehls zu? /etc/rc.local? Sie müssen jedoch den sudo-Zugriff verwenden, um diese Datei zu bearbeiten.

sudo nano /etc/rc.local

135
2017-08-05 16:40



Dies beantwortet am direktesten die Frage: Wie man einfach einige Skripte ausführt, wenn das System bootet. Upstart erledigt eine komplexere Aufgabe: Startet Daemon-Prozesse. - Dogweather
Also startet der Upstart Daemon-Prozesse, während /etc/rc.local Bash-Skripte startet? - Donato
Dies sollte die akzeptierte Antwort sein ... - Android Dev
Sollte es? Das funktioniert heutzutage nicht mehr, oder? - DaVince
Doenst arbeitet mit Ubuntu 17.04 systemd - qodeninja


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

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

    Sie finden eine lesbare Einführung in: http://upstart.ubuntu.com/getting-started.html die Manpages man 5 init und man 8 init geben Sie die vollständigen Details.

  2. Ein Shell-Skript namens .gnomerc in Ihrem Home-Verzeichnis wird jedes Mal automatisch abgerufen, wenn Sie sich bei einer GNOME-Sitzung anmelden. 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 nicht gestartet wird, bis der .gnomerc Das Skript ist fertig. Wenn Sie also ein lang laufendes Programm automatisch starten möchten, müssen Sie es anhängen & zum Programmaufruf, um ihn von der laufenden Shell zu lösen.

  3. Die Menüoption System -> Einstellungen -> Startup-Anwendungen Hier können Sie festlegen, welche Anwendungen beim Start Ihrer grafischen Sitzung gestartet werden sollen (Ubuntu gibt einige vor) und Sie können sie nach Belieben hinzufügen oder entfernen. Dies hat fast den gleichen Zweck und Umfang der .gnomerc Skript, außer Sie müssen es nicht wissen sh Syntax (aber Sie können auch keine verwenden sh Programmierkonstrukt).


68
2017-08-05 14:02



3) "Dies hat fast den gleichen Zweck und Umfang des .gnomerc-Skripts", außer .gnomerc scheinbar läuft Vor Laden von Unity und Startup Applications scheinbar läuft nach Unity wird geladen. Ich musste ein Programm ausführen, das auf der Unity-Menüleiste sitzt und es hat einen großen Unterschied in diesem Fall gemacht! - That Brazilian Guy
@ ruda.almeida Danke, dass du das unterstrichen hast. Die Antwort wurde in den Tagen vor der Einheit geschrieben. - Riccardo Murri
sudo update-rc.d myscript.sh defaults, wobei /etc/init.d/myscript.sh Ihr Skript ist, führt es auch beim Start aus. - Dan Dascalescu


Für 15.04 und später:

Um ein (kurzlebiges) zu laufen1 Befehl beim Start mit Systemd, können Sie eine Systemd Unit des Typs verwenden OneShot. Zum Beispiel, erstellen /etc/systemd/system/foo.service enthält:

[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 wird dies nur umgewandelt ein typischer Upstart-Job zu einem System (siehe Systemiert für Upstart-Benutzer).

Sie können mehrere Befehle aus derselben Servicedatei mit mehreren Befehlen ausführen ExecStart Linien:

[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. EIN - vor dem Pfad sagt Systemd, einen Nicht-Null-Exit-Status zu ignorieren (anstatt es als Fehler zu betrachten).

Relevant:


Für Benutzersitzungen können Sie die Systemeinheit in erstellen ~/.config/systemd stattdessen. Dies sollte ab 16.04 funktionieren, jedoch nicht frühere Versionen von Ubuntu mit systemd (da diese noch Upstart für Benutzersitzungen verwenden). User Session Units können mit den gleichen Befehlen wie bei Systemdiensten gesteuert werden, aber mit dem --user Option hinzugefügt:

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

1Im Gegensatz zu langlebigen Dämonen.


53
2018-01-09 19:21



Ist es möglich, dem Job Priorität einzuräumen? oder angeben, dass es von einem anderen Dienst abhängt, der zuerst gestartet wird? - r3wt
@ r3wt ja, dafür gibt es verschiedene Möglichkeiten. Das WantedBy hier verwendet, zum Beispiel, startet es, wenn die multi-user.target ist erreicht. Sie können verwenden Before, After, Requiresusw. Siehe man systemd.unit - muru
@PerlDuck nicht das Einzige, was fehlte. Vielen Dank! - muru
Bitte. - Übrigens, die RemainAfterExit hängt von dem Dienst ab, den Sie starten, und seinem gewünschten Verhalten. Zum Beispiel, /bin/df -h <s> würde </ s> haben sollen RemainAfterExit=no. - PerlDuck
@PerlDuck Da ist nichts inhärent df das braucht RemainAfterExit=no. Es sei denn, Sie möchten den Befehl jedes Mal wiederholt ausführen systemctl start foo. - muru


$HOME/.config/autostart
  • Dieser Speicherort enthält die Startanwendungsliste.
  • .desktop Hier kann eine Datei eingetragen werden, die beim Start ausgeführt wird.

Beispielbeispiel für .desktop Datei:

Putting folgend .desktop Datei in $HOME/.config/autostart und gegeben 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 durch den Pfad zu Ihrem ersetzt script.sh
(normalerweise zu empfehlen /usr/local/bin so kann das durch direktes Kommando gesagt werden myscript Ersetzt mit "</path/to/script>").

Beispiel von script.sh:

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

Ergebnis: .desktop Datei wird von gestartet werden $HOME/.config/autostart welche Skript ausführen von Exec=

Daher können Sie das gewünschte Shell-Skript beim Start ausführen!


22
2017-07-20 06:14





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

Alternativ können Sie es zu /etc/init.d/rc.local hinzufügen oder ein Emporkömmling Job, wenn es ein mehr ist niedriges Niveau Sachen.

Sieh dir das an https://help.ubuntu.com/community/UbuntuBootupHowto Für mehr Information


18
2017-08-04 19:59





Du solltest benutzen Emporkömmling dafür. 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 auch die Voraussetzungen für den Start Ihres Skripts eingeben (d. H. Benötigen Sie das Netzwerk? Usw.)


5
2017-08-04 19:58





cron Antwort implementiert anders als oben gewählt

Diese Antwort verwendet immer noch cron verwendet jedoch eine andere Methode als die Antwort mit der höchsten Bewertung. Dies funktioniert seit Ubuntu 16.04 aber wahrscheinlich viel früher unterstützt. Es ist nur, dass ich angefangen habe zu benutzen cron Jobs ausführen, wenn Computer seit 16.04.

Wann tut cron Lauf?

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

Eine Sache zu beachten ist cron kann Ihnen den Status von Jobs per E-Mail senden und @reboot Jobs werden so früh ausgeführt, dass Netzwerkmanager und E-Mail nicht ausgeführt werden, außer du hast einen sleep befehle in deine Skripte.

Wo können Sie Ihre Skripte ablegen?

Stellen 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`

3
2018-01-03 01:02



Es gibt viele verschiedene Möglichkeiten, Cronjobs hinzuzufügen, aber der Kern der stark gewählten Antwort und Ihre Antwort ist immer noch die @reboot. - muru
Alternative Methoden zum Hinzufügen von Crontabs sollten veröffentlicht werden askubuntu.com/q/2368/158442, was explizit das Hinzufügen von Cron-Jobs betrifft. - muru
Ich bin anderer Ansicht. Der Kern der Antwort verwendet in Frage crontab -e was einige aufgrund der vim-ähnlichen Schnittstelle für eine der schwarzen Künste halten. Auf der anderen Seite könnte diese Antwort diejenigen ansprechen, deren Gehirne auf eine bestimmte Art und Weise verkabelt sind. Wir sind nicht alle aus demselben Guss. Andererseits hat diese Antwort bereits eine Stimme, also lassen wir die Demokratie ihren Lauf nehmen. - WinEunuuchs2Unix
Oh bitte. Sie und ich wissen beide, dass der Editor geändert werden kann. - muru
@muru Ja, wahrscheinlich, weil du es mir beigebracht hast und ich gelernt habe, den Editor auf etwas wie Nano oder ein paar andere CLIs zu ändern. Aber ich bin im Geditlager. Außerdem crontab -e bringt Erinnerungen an Sterne ("*") für Minuten, Stunden, etc. hervor, die ich immer gefunden habe, für die ich Anweisungen googlen muss. Ich finde immer noch Verwendung /etc/cron.d und /etc/cron.daily Ich gehe zur Wahl. Zumal es sich spiegelt /etc/udev/rules.d und /etc/systemd/system-sleep Methoden. Es scheint nur eine schöne Passform. - WinEunuuchs2Unix