Wie starte ich Skripte beim Start?

453

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

    
myusuf3 04.08.2010, 21:54
quelle

9 Antworten

190

Abhängig davon, welche Art von Skripts Sie ausführen müssen. Für Dienste und Ähnliches sollten Sie upstart verwenden. Aber für ein Benutzerskript sollten diese als Sitzungsskripte von gnome gestartet werden! Schau unter System & gt; Einstellungen & gt; Startup-Anwendungen.

Nebenbei bemerkt, wenn Sie einige Skripts benötigen, die bei der Terminal-Anmeldung ausgeführt werden sollen, können Sie sie zum . 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 wie:

verwenden
start on startup
task
exec /path/to/command

Speichern Sie dies in einer .conf -Datei in /etc/init (falls Sie es beim Systemstart als root ausführen wollen) oder in ~/.config/upstart (wenn Sie es brauchen wenn Sie sich als Benutzer anmelden, wenn Sie sich anmelden).

    
LassePoulsen 05.08.2010, 01:26
quelle
469

Ein Ansatz besteht darin, eine Aufgabe @reboot cron hinzuzufügen:

  1. Wenn Sie crontab -e ausführen, können Sie Ihren Cron bearbeiten.
  2. Eine Zeile wie folgt hinzufügen:

    @reboot /path/to/script
    

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

ceejayoz 04.08.2010 21:57
quelle
128

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

sudo nano /etc/rc.local
    
paolo granada lim 05.08.2010 18:40
quelle
68

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 /etc/init findet. 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 Einleitung zu: Pfandrecht die man-Seiten man 5 init und man 8 init geben Sie 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 Home-Verzeichnis bezogen. 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 Skript .gnomerc beendet ist. Wenn Sie also ein lang laufendes Programm automatisch starten möchten, müssen Sie & an den Programmaufruf anhängen, um es von der laufenden Shell zu trennen.

  3. Die Menüoption System - & gt; Einstellungen - & gt; Startup Applications ermöglicht es Ihnen, zu definieren, 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 denselben Zweck und Umfang wie das .gnomerc -Skript, außer dass Sie sh -Syntax nicht kennen müssen (aber Sie können auch kein sh -Programmierkonstrukt verwenden).

Riccardo Murri 05.08.2010 16:02
quelle
51

Für 15.04 und später:

Um einen (kurzlebigen) 1 Befehl beim Start mit Systemd auszuführen, können Sie eine Systemeinheit vom Typ OneShot verwenden. Erstellen Sie beispielsweise /etc/systemd/system/foo.service containing:

[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

Dies bedeutet im Wesentlichen, dass ein typischer Upstart-Job in einen systematischen umgewandelt wird (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. A - , bevor der Pfad systemd anweist, einen Nicht-Null-Exit-Status zu ignorieren (anstatt ihn als Fehler zu betrachten).

Relevant:

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

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

1 Im Gegensatz zu langlebigen Dämonen.

    
muru 09.01.2016 20:21
quelle
22
$HOME/.config/autostart
  • Dieser Ort enthält die Startanwendungsliste.
  • .desktop Datei kann hier angegeben werden, die beim Start ausgeführt wird.

Beispiel für .desktop file:

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

[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 (normalerweise empfohlen für /usr/local/bin so - das kann direkt ausgeführt werden, zB myscript ersetzt durch "</path/to/script>" ).

Beispielbeispiel für script.sh :

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

Ergebnis: .desktop file wird von $HOME/.config/autostart gestartet, die Skript von Exec=

ausführen

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

    
Pandya 20.07.2014 08:14
quelle
18

Für einfache Dinge können Sie einen Befehl in System- & gt; Einstellungen- & gt; Sitzungen hinzufügen, der auf den Speicherort Ihres Skripts zeigt.

Alternativ können Sie es zu /etc/init.d/rc.local hinzufügen oder einen Neustart durchführen, wenn es ein low level Zeug.

Sehen Sie sich Pfandrecht für weitere Informationen an

    
tutuca 04.08.2010 21:59
quelle
5

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

    
txwikinger 04.08.2010 21:58
quelle
3

cron antwort implementiert anders als oben gewählt

Diese Antwort verwendet weiterhin cron , verwendet jedoch eine andere Methode als die Antwort mit der höchsten Wahl. Dies funktioniert seit Ubuntu 16.04 aber wahrscheinlich viel früher unterstützt. Ich benutze cron nur, um Jobs auszuführen, wenn der Computer seit 16.04 startet.

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

Beachten Sie, dass cron Ihnen den Status von ausgeführten Jobs per E-Mail senden kann und @reboot Jobs so früh ausgeführt werden, dass Netzwerkmanager und E-Mail nicht ausgeführt werden, wenn Sie nicht den Befehl sleep in Ihr Skript einfügen.

Wo legen Sie Ihre Skripte ab

?

Platzieren Sie Ihre Skripte im 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 03.01.2018 02:02
quelle

Tags und Links