it-swarm.com.de

Wie führe ich Skripts beim Start aus?

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

511
myusuf3

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

Wenn Sie einige Skripte für die Terminalanmeldung benötigen, können Sie diese zur Datei . Bash_login in Ihrem Home-Verzeichnis 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 Datei in einer .conf -Datei in /etc/init (wenn Sie sie beim Systemstart als Root ausführen müssen) oder in ~/.config/upstart (wenn Sie sie als Benutzer ausführen müssen, wenn) Sie loggen sich ein).

204
LassePoulsen

Ein Ansatz ist das Hinzufügen einer @reboot cron Aufgabe:

  1. Wenn Sie crontab -e ausführen, kö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.

546
ceejayoz

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

Sudo nano /etc/rc.local
159

Für 15.04 und später:

Einen (kurzlebigen)1 Befehl beim Start mit systemd , können Sie eine Systemeinheit vom Typ OneShot verwenden. Erstellen Sie beispielsweise _/etc/systemd/system/foo.service_ mit:

_[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 einfach einen typischen Upstart-Job in einen systemd-Job (siehe Systemd für Upstart-Benutzer ).

Sie können mehrere Befehle aus derselben Servicedatei ausführen, indem Sie mehrere ExecStart-Zeilen verwenden:

_[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 weist systemd an, einen Exit-Status ungleich Null zu ignorieren (anstatt ihn als Fehler zu betrachten).

Relevant:


Für Benutzersitzungen können Sie die Systemeinheit stattdessen in _~/.config/systemd_ 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 hinzugefügten Option _--user_:

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

Shell-Syntax

Beachten Sie, dass systemd im Gegensatz zu Upstart die Befehle _Exec*_ nicht über eine Shell ausführt. Es führt einige begrenzte Variablenerweiterungen und Mehrfachbefehle (durch _;_ getrennt) selbst aus, aber das war es auch schon, was die Shell-ähnliche Syntax betrifft. Um etwas komplizierteres zu tun, z. B. Umleitung oder Pipes, setzen Sie Ihren Befehl in _sh -c '...'_ oder _bash -c '...'_.


1Im Gegensatz zu langlebigen Dämonen.

74
muru

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

  1. Das pstart System führt alle Skripte aus, von denen es eine Konfiguration im Verzeichnis /etc/init findet. 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 unter: http://upstart.ubuntu.com/getting-started.html Die Manpages man 5 init und man 8 init geben Ihnen die vollständigen Details .

  2. Jedes Mal, wenn Sie sich bei einer GNOME-Sitzung anmelden, wird automatisch ein Shell-Skript mit dem Namen .gnomerc 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 gestartet wird, wenn das Script .gnomerc beendet ist. Wenn Sie daher ein Programm mit langer Laufzeit automatisch starten möchten, müssen Sie & an den Programmaufruf anhängen, um es von der laufenden Shell zu trennen.

  3. Mit der Menüoption System -> Einstellungen -> Startanwendungen können Sie festlegen, welche Anwendungen beim Start Ihrer Grafiksitzung gestartet werden sollen (Ubuntu definiert einige davon vor). und fügen Sie sie Ihrem Geschmack hinzu oder entfernen Sie sie. Dies hat fast den gleichen Zweck und Umfang wie das Skript .gnomerc, außer dass Sie die Syntax sh nicht kennen müssen (aber Sie können auch kein sh -Programmierkonstrukt verwenden).

71
Riccardo Murri
$HOME/.config/autostart
  • Dieser Speicherort enthält die Liste der Startanwendungen.
  • Hier kann die Datei .desktop abgelegt werden, die beim Start ausgeführt wird.

Beispiel für die Datei .desktop:

Folgende .desktop Datei in $HOME/.config/autostart einfügen und chmod +x übergeben:

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

Hier wird "</path/to/script>" durch den Pfad zu Ihrem script.sh ersetzt
(in der Regel empfohlen, um /usr/local/bin auszuführen, sodass myscript durch "</path/to/script>" ersetzt werden kann).

Beispielbeispiel für script.sh:

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

Ergebnis: .desktop Datei wird von $HOME/.config/autostart gestartet, die das Skript von Exec= ausführt

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

27
Pandya

Für einfache Dinge können Sie einen Befehl in System-> Preferences-> Sessions hinzufügen, der auf die Position Ihres Skripts verweist.

Alternativ können Sie es zu /etc/init.d/rc.local hinzufügen oder einen pstart Job ausführen, wenn es sich um eine niedrigere Ebene handelt Sachen.

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

18
tutuca

Verwenden Sie dazu pstart . 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 (d. H., Muss das Netzwerk ausgeführt werden? Usw.).

5
txwikinger

cron Antwort wurde anders implementiert als von den Besten 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, wird aber wahrscheinlich viel früher unterstützt. Es ist nur so, dass ich angefangen habe, cron zu verwenden, um Jobs auszuführen, wenn der Computer seit 16.04 hochfährt.

Wann wird cron ausgeführt?

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 zu beachtende Sache ist, dass cron Sie per E-Mail über den Status der ausgeführten Jobs und @reboot über den Status der ausgeführten Jobs informiert, sodass Netzwerkmanager und E-Mail erst ausgeführt werden, wenn Sie einen sleep -Befehl in Ihr Skript einfügen ( s).

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