Führen Sie ein Skript beim Abmelden / Neustarten / Herunterfahren in Ubuntu aus

30

Ich möchte eine .shDatei mit bash beim Abmelden und Herunterfahren von Ubuntu ausführen . Ich habe im Web nach Updates für KDE und GNOME gesucht. Das Skript ist einfach. Ich muss nur wissen, ob ich die Codezeile zur Datei "Abmelden / Herunterfahren" hinzufügen kann oder ob ich in einem anderen Skript darauf verweisen muss.

DirtyDenimDan
quelle
1
Setzen Sie Symlinks zu ausführbaren Dateien in /etc/init.d in /etc/rc0.d und /etc/rc6.d
Noch ein Benutzer
2
Bitte überlegen Sie, ob Sie die aktualisierte Antwort akzeptieren (mit systemd), damit die Leute sie oben sehen.
Jonathan Y.

Antworten:

18

So führen Sie ein Skript beim Abmelden aus:

Fügen Sie die folgende Zeile hinzu:

session-cleanup-script=/path/to/script

in /etc/lightdm/lightdm.confDatei.

Sie müssen lightdm neu starten, damit diese Änderung wirksam wird. Gehen Sie dazu in tty1 mit Ctrl+ Alt+ F1, melden Sie sich mit Ihrem Benutzernamen und Passwort an und führen Sie den folgenden Befehl aus:

sudo service lightdm restart

Hinweis: Verwenden Sie Ctrl+ Alt+ F7, um zur grafischen Sitzung zu wechseln

So führen Sie ein Skript beim Neustart aus:

  1. Fügen Sie Ihr Skript ein /etc/rc0.d
  2. Mach es ausführbar: sudo chmod +x K99_script
  3. Anmerkungen:
    • Die Skripte in diesem Verzeichnis werden in alphabetischer Reihenfolge ausgeführt.
    • Der Name Ihres Skripts muss mit "" beginnen K99, um zur richtigen Zeit ausgeführt zu werden.

So führen Sie ein Skript beim Herunterfahren aus:

  1. Fügen Sie Ihr Skript ein /etc/rc6.d
  2. Mach es ausführbar: sudo chmod +x K99_script
  3. Anmerkungen:
    • Die Skripte in diesem Verzeichnis werden in alphabetischer Reihenfolge ausgeführt.
    • Der Name Ihres Skripts muss mit "" beginnen K99, um zur richtigen Zeit ausgeführt zu werden.

Quellen:

Radu Rădeanu
quelle
4
Es ist üblich , Skripte so zu benennen, dass sie mit K"Kill" und S"Start" beginnen.
kiri
Was ist, wenn das Skript Sudo-Berechtigungen benötigt? Soweit ich weiß, werden die Skripte /etc/rc6.d als Benutzer ausgeführt und können gksudo nicht verwenden.
Urhixidur
1
funktioniert bei mir mit 14.04 nicht, gibt es eine änderung oder eine nicht näher bezeichnete wichtige tatsache?
Tomasb
2
K99-Ratschläge eignen sich nicht zum Herunterfahren / Neustarten, wenn Sie einige Daten speichern möchten, da dies NACH dem Aufheben der Bereitstellung geschieht UND K zum Deaktivieren des Skripts verwendet wird (siehe /etc/rcS.d/README). zum booten platziere dein script nach dem mounten, blieb dabei hängen, weil diese
fehlinformation
6
Dies ist sehr falsch: i) Skriptnamen müssen mit a Kfür Runlevel 0, 1 und 6 und Sfür Runlevel 2, 3, 4 und 5 beginnen; ii) Sie nicht brauchen , um das Skript zu nennen K99_foo, bestimmt die Zahl nur die Reihenfolge die Skripte in ausgeführt werden , benötigen Sie ein wählen , die größer ist als die anderen , wenn Sie es möchten zuletzt ausgeführt werden. iii) Runlevel 0 ist kein Neustart! ; Es ist zum Herunterfahren. 6 ist für einen Neustart. iv) Skripte haben in den /etc/rcN.dVerzeichnissen nichts zu suchen . Sie sollten stattdessen in /etc/init.dund verbunden mit sein /etc/rcN.d.
Terdon
14

Wie mache ich das mit systemd

Wenn Sie diesen Thread nach Juni 2016 finden, verwenden Ubuntu und seine Derivate, einschließlich Mint, systemd, um die Systeminitialisierung und das Herunterfahren zu steuern. Ich hatte Probleme mit dem alten Ansatz, also recherchierte ich nach dem System.

Mit systemd erstellen Sie eine oder zwei Dateien, um Ihre Skripte mithilfe der folgenden Vorlagen aufzurufen, und führen einen Befehl aus. Einfach.


GUI-Version

Erstellen Sie zuerst die Skripte, die Sie beim Starten und / oder Herunterfahren ausführen möchten. Ich habe .scopening_atstart und .scfullcopy_atend erstellt.

Stellen Sie dann sicher, dass beide Programme ausführbar sind, indem Sie mit der rechten Maustaste auf die Datei klicken, Eigenschaften auswählen und sicherstellen, dass Sie unter Berechtigungen die Option Datei als Programm ausführen lassen ausgewählt haben.

Die beiden von mir erstellten Dateien füllen und speichern den Inhalt einer Ramdisk. Sie erstellen auch eine Datei in meinem Home-Verzeichnis, um zu beweisen, dass der Dienst funktioniert. Sie waren von der Form:

#!/bin/sh
cp -pru /home/john/zRamdisk/subdirectory1/* /home/john/.wine/drive_c/subdirectory1/
rm /home/john/stop_time
date +%D' '%T > /home/john/stop_time

Dann habe ich meinen Dateimanager als root geöffnet /etc/systemd/systemund eine Datei startup.service und eine Datei save-ramdisk.service erstellt. Natürlich können Sie Ihre eigenen Namen auswählen, und generische Namen können eine Startdatei mit dem Namen johns_start.service und eine Datei zum Herunterfahren mit dem Namen johns_shutdown.service enthalten. Wählen Sie einfach keine vorhandenen Dienstnamen aus.

[Unit]
Description=Startup Applications

[Service]
Type=oneshot
RemainAfterExit=false
ExecStart=/home/john/.scopening_atstart

[Install]
WantedBy=multi-user.target

und

[Unit]
Description=Save Ramdisk to Wine drive C

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/home/john/.scfullcopy_atend

[Install]
WantedBy=multi-user.target

Sie können dieselben Dienstdateien verwenden und meinen durch den vollständigen Pfad Ihres ausführbaren Skripts ersetzen.

Führen Sie zum Schluss für jeden Befehl den Befehl systemctl enable your_files_name aus (jedoch ohne den Suffix-Dienst). Also war mein erstersystemctl enable startup

Starten Sie den Computer einmal neu, um die Dienste zu starten. Der Startdienst wird immer dann ausgeführt, wenn systemd in das Mehrbenutzerziel eintritt, und der Stoppdienst, wenn es das Mehrbenutzerziel verlässt. Alternative Servicedateien mit unterschiedlichen Aktivierungsbedingungen werden unten beschrieben.


CLI (Command Line) Version

In dieser Beschreibung wird davon ausgegangen, dass Sie von Ihrem Home-Verzeichnis aus und nicht von / home / john aus arbeiten, sudo nach Bedarf verwenden und den Editor auswählen, in dem ich vim oder svim schreibe.

Erstellen Sie in der ersten Zeile Shell-Skripte zum Starten und Herunterfahren #!/bin/shund machen Sie sie mit ausführbar chmod +x my_new_filename.

Erstellen Sie zwei Dateien wie oben oder in diesem Beispiel eine Datei, um Start- und Herunterfahraufgaben zu erledigen. Ich werde Skripte in meinem Home-Verzeichnis ausführen, aber @don_crissti hat bei Stack Exchange einige Alternativen aufgezeigt.

svim /etc/systemd/system/start_and_stop.service

und in den Dateiinhalt kopieren:

[Unit]
Description=Run Scripts at Start and Stop

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/home/john/.startup_commands  #your paths and filenames
ExecStop=/home/john/.shutdown_commands

[Install]
WantedBy=multi-user.target

Dann Aktivieren Sie den Dienst mit dem Befehl:

systemctl enable start_and_stop

und starten Sie Ihr System neu, wonach die Dienste aktiv sind. Die Befehle systemctl is-enabled start_and_stopund systemctl is-active start_and_stopkönnen zur Überwachung Ihrer neuen Dienste verwendet werden.


Ändern der Auslösebedingungen für das Herunterfahren

Die Dateien verwenden vor allem das Öffnen oder Schließen der Mehrbenutzerumgebung, um die Ausführung der Skripte einzuleiten. Die folgende Datei verwendet den Anfang von vier möglichen Herunterfahrprozessen, um die Skripte zu starten. Durch Hinzufügen oder Entfernen der Ziele in der Vorher-Zeile + der WantedBy-Zeile können Sie feinere Unterscheidungen treffen:

Diese Datei wurde in einer Antwort bei Unix & Linux von @Matthias vorgeschlagen, aber ich konnte sie nicht zum Laufen bringen, bis ich einen Installationsabschnitt hinzugefügt habe.

Bearbeiten Sie das Skript erneut in /etc/systemd/service/und aktivieren Sie es mit systemctl enable your_file_name. Als ich die Ziele geändert habe, habe ich den systemclt disable file_nameBefehl verwendet und wieder aktiviert, wodurch er mit den Zielverzeichnissen verknüpft wurde. Starten Sie neu und der Dienst wird ausgeführt.

[Unit]
Description=Do something required
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target
# This works because it is installed in the target and will be
#   executed before the target state is entered
# Also consider kexec.target

[Service]
Type=oneshot
ExecStart=/home/john/.my_script  #your path and filename

[Install]
WantedBy=halt.target reboot.target shutdown.target
John 9631
quelle
1
Obwohl Ihr Beitrag korrekt ist, würde ich vorschlagen, ihn zu verbessern, indem Sie ein Beispiel hinzufügen, wie solche Schritte mit Systemen durchgeführt werden können. Bitte lassen Sie es mich wissen, wenn Sie Ihren Beitrag bearbeiten. Vielen Dank und willkommen bei AskUbuntu
Sergiy Kolodyazhnyy
Hallo Serg, meinst du Beispiele wie in dem verlinkten Beitrag oder hattest du etwas anderes im Sinn? Zweitens bin ich mir nicht sicher, wie ich Sie "informieren" soll, da ich keinen Mechanismus zur Kontaktaufnahme mit einem anderen SO-Benutzer finden kann.
John 9631
Ja, Sie können ein Beispiel wie in Ihrem anderen Beitrag angeben. Nur zu sagen, "gehe zu diesem anderen Link" ist nicht sehr gut und lässt deine Antwort faul aussehen. Auch für andere SO Benutzer Verwendung @ vor den Benutzernamen in Verbindung treten, zum Beispiel @Serg
Sergiy Kolodyazhnyy
Sehr verbessert. Sehr gut, macht weiter so!
Sergiy Kolodyazhnyy
1
Je nach man systemd.unitBenutzer können erstellte Dateien in $XDG_CONFIG_HOME/systemd/userund an anderen lokalen Speicherorten abgelegt werden
Antonios Hadjigeorgalis