Wie führe ich ein Skript zum Anmelden / Abmelden von Unity aus?

8

Ich habe zwei Skripte - eines zum Mounten einiger Ordner über SSHFS - und eines zum Aufheben der Bereitstellung.

Ich möchte das Mount-Skript starten, wenn mein Standard-Ubuntu-Desktop gestartet wird (nachdem ich mich an der grafischen Konsole angemeldet habe) - und das Unmount-Skript, wenn ich mich oben rechts vom Zahnrad "abmelden ..." der Desktop.

Kann mir bitte jemand sagen, wie ich das erreichen kann? Was sind die bequemsten / Standard-Hooks, um Befehle beim Starten / Beenden des Desktops auszuführen?

aSteve
quelle
Ich erwarte nicht, dass das Timing kritisch ist. Was zählt, ist, dass das erste Skript innerhalb einer Sekunde oder so ausgeführt wird ... bevor der Benutzer interaktiv Anwendungen startet. Beim Abmelden ist es nur wichtig, dass das zweite Skript ausgeführt wird, bevor sich jemand anderes an der Konsole anmeldet.
aSteve
Ich habe Root-Zugriff. Das Installieren von Paketen ist kein Problem. Wenn möglich, möchte ich nur Berechtigungen auf Benutzerebene verwenden - vorausgesetzt, es gibt eine gute Möglichkeit, dies zu tun. Meine Skripte benötigen kein Root. Ich suche nach Ratschlägen, wie ich meine Skripte beim Starten / Stoppen von Unity am besten initiieren kann ... Der größte Teil meiner Linux / Unix-Erfahrung befindet sich in einem Nicht-GUI-Kontext. Mit XWindows der alten Schule und einem Vanille-Fenstermanager hätte ich das von .xinitrc aus tun können. Was ist der beste Weg mit dem modernen Standard-Unity-Desktop?
aSteve
Ich möchte die Abmeldeaktion nicht davon abhängig machen, was gemountet ist / nicht ... Das alles wird von den vorhandenen Skripten dynamisch behandelt. Was ich brauche, ist eine nette Möglichkeit, das erste Skript beim Anmelden und das zweite beim Abmelden für die GUI-Sitzung auf der Konsole auszuführen. Ich habe "Startup Applications" gefunden - aber das würde nur die erste Hälfte des Problems lösen.
aSteve
Ich denke nicht, dass "Login-Anwendungen" die richtige Strategie für beide Skripte ist. Ich habe zwei Skripte ... eines richtet die Dinge für meine GUI-Sitzung ein; Der andere bereinigt nach einer GUI-Sitzung. Beide sollten als derselbe Benutzer wie die GUI-Sitzung ausgeführt werden. Beides erfordert keine Argumente. Ich muss einen geeigneten Weg finden, um die Skripte zu starten - zum richtigen Zeitpunkt ist das alles. Es sollten keine Annahmen darüber erforderlich sein, was die Skripte tatsächlich tun. In dieser Frage geht es darum, wie Ereignisse verknüpft werden, die mit dem An- und Abmelden von Unity zusammenfallen.
aSteve

Antworten:

9

In Anbetracht Ihrer Anforderung, einen Job auszuführen, wenn Sie sich bei Unity anmelden, und nicht für andere Anmeldungen, scheint ein Upstart- Sitzungsjob perfekt zu sein.

Möglicherweise haben Sie es bemerkt: Prozesse, die Sie nach einer GUI-Anmeldung ausführen, werden einem zweiten initProzess unterzogen. Dies initist eine ordnungsgemäße Upstart-Initiale, und Sie können Sitzungsjobs basierend auf den von ihr ausgegebenen Ereignissen starten und stoppen. Es werden überhaupt keine Root-Rechte benötigt. Besser noch (oder schlechter je nach Perspektive), dies wird für kopflose Systeme noch nicht vollständig unterstützt. Ein SSH-Login hat den Benutzer init nicht von einem Schnelltest gestartet, den ich gerade durchgeführt habe.

Erstellen Sie eine neue .confDatei, um einen Sitzungsjob zu erstellen ~/.config/upstart. Dies ist das Standardprimärverzeichnis für Upstart-Sitzungsjobs ( $XDG_CONFIG_HOME/upstart). Erstellen Sie es, wenn es nicht vorhanden ist. Hier ist ein Beispieljob:

tee ~/.config/upstart/myjob.conf <<EOF
description "My job"
start on desktop-start
stop on desktop-end

script 
       firefox 'http://upstart.ubuntu.com/cookbook/#session-job'
end script
EOF

Sie können es manuell steuern:

start myjob 
# or
initctl start myjob

Der serviceBefehl wird verwendet, um Systemjobs (die in /etc/init.doder /etc/init) zu steuern . Zum Steuern von Sitzungsjobs muss der initctlBefehl verwendet werden, mit dem mit Upstart interagiert wird.

Sehen Sie man upstart-eventsweitere Veranstaltungen können Sie verwenden.

muru
quelle
Ich hatte es nicht bemerkt ... aber ... ich stimme zu - ein Job als Emporkömmling sieht perfekt aus. Ich vermisse wahrscheinlich etwas Offensichtliches ... aber nachdem ich ~ / .config / upstart / myjob.conf (wie oben) erstellt habe, wenn ich "service myjob start" ausführe, bekomme ich "myjob: nicht erkannter Service" Irgendwelche Ideen?
aSteve
Es wurde behoben: Ich musste "start myjob" anstelle von "service myjob start" verwenden. Ein weiterer nützlicher Befehl war "initctl list"
aSteve
@ aSteve Entschuldigung. Ich habe es korrigiert,
1.
Kein Problem. Der Upstart / Sessions-Ansatz sieht definitiv richtig aus. Trotzdem habe ich noch nicht den besten Weg gefunden, um separate (kurzlebige) Start- und Stoppskripte auszuführen. Kann ich nur 1 .conf-Datei verwenden oder benötige ich 2? Sollte es ein "Service" oder eine "Aufgabe" sein? Soll ich Pre / Post Start und Pre / Post Stop verwenden? Ich brauche / möchte nicht, dass ein Prozess zwischen Start und Stopp ausgeführt wird ... es sei denn, es gibt eine einfache Möglichkeit, ein Symbol in die Symbolleiste einzufügen ... obwohl dies wahrscheinlich übertrieben ist - für meine Zwecke.
aSteve
1
Schließlich. Nach langem Hacken ... habe ich festgestellt, dass die myendtask "am Sitzungsende" und nicht "am Desktopende" ausgelöst werden muss. Dies ist etwas kontraintuitiv, funktioniert aber. (Endlich!)
aSteve
1

Die Lösung bestand darin, Startaufgaben zu verwenden. Ich benötigte zwei Aufgaben - eine, die ausgelöst wurde, als der Desktop für einen Benutzer initialisiert wurde. die zweite, wenn die Benutzersitzung abläuft. Die folgenden zwei Skripte funktionieren für mich unter Ubuntu 14.04.

In ~ / .config / upstart / desktopOpen.conf

description "Desktop Open Task"
start on desktop-start
task
script
# Commands to mount sshfs go here as shell-script.
end script

In ~ / .config / upstart / desktopClose.conf

description "Desktop Close Task"
start on session-end
task
script
# Commands to unmount sshfs go here as shell-script.
end script

Ich drücke die Daumen, dass diese Ereignisse auch in zukünftigen Ubuntu-Versionen die Anforderungen erfüllen werden. Ich dachte, es lohnt sich, meine Lösung hier zu veröffentlichen - falls sie für andere von Nutzen ist.

aSteve
quelle
-1

Hier einige Vorschläge zum Ausführen eines Skripts nach der Anmeldung:

StackOverflow Linux-Skript nach dem Start : Cliff stellt fest, dass Ihre * .sh-Datei in /etc/profile.d abgelegt wird.

Wenn Sie beim Booten Skripte ausführen möchten, finden Sie hier einige Vorschläge:

StackOverflow Linux-Skript nach dem Start : Cliff-Notizen verwenden /etc/rc.local oder crontab.

Higgs
quelle
1
Keine dieser Optionen sieht "richtig" aus. Ich möchte das Skript nur ausführen, wenn ich mich im Sinne des Startens / Beendens einer Unity-Sitzung an- und abmelde. Ich möchte meine Skripte nicht jedes Mal ausführen, wenn eine neue Anmeldung erfolgt. Neue Anmeldungen können remote über ssh usw. initiiert werden. Ich möchte jedoch nicht, dass diese das Skript ausführen, da sie keine neue Unity-Sitzung (auf der Konsole) initiieren.
aSteve