Wie kann ich die Zeit für die Anmeldung verkürzen, indem ich einige Startanwendungen verschiebe / verzögere?

11

Ich habe einige Anwendungen so eingerichtet, dass sie bei jeder Anmeldung automatisch gestartet werden (z. B. redshift-gtk, gtg), aber nachdem diese zu Startanwendungen hinzugefügt wurden ( System -> Preferences -> Startup Applications), hat sich die Zeit für die Anmeldung offensichtlich erhöht. Aus diesem Grund dauert es zu lange, bis meine Panels, Desktops usw. angezeigt werden - bis ich warten muss.

Ich brauche diese Apps nicht, um sofort verfügbar zu sein, aber es wäre gut, wenn sie irgendwann gestartet würden. In der Zwischenzeit steht das Ubuntu-Menü / -Panel zum Ausführen anderer Apps zur Verfügung, die ich möglicherweise benötige.

Ich habe versucht, den Befehl at zu verwenden, mit der Absicht, alle Startanwendungen zu bearbeiten, um die Befehle in die Warteschlange at zu stellen, aber dies hat nicht funktioniert, da die Apps nicht die erforderlichen Umgebungsvariablen erhalten (wie DISPLAY).

Wird dafür der niceBefehl verwendet? Irgendwelche anderen Ideen, wie ich das erreichen kann? Wenn möglich, möchte ich das Bearbeiten der Befehle für Startanwendungen vermeiden, da dies einen großen Aufwand für die Replikation auf anderen von mir verwendeten Computern bedeuten würde.

Koushik
quelle
@ Riccardo Murri - Du hast recht. Ich habe jetzt meinen Fragentitel bearbeitet, um meine Absicht besser darzulegen.
Koushik
Ich würde sicher auch Startprogramme und -dienste kürzen, wenn Sie dies noch nicht getan haben.
Aperson

Antworten:

11

Die Anzahl der Sekunden, die zum Warten auf das Laden Ihres Desktops benötigt werden, ist beliebig und kann sich je nach Situation ändern. sleepVersuchen Sie stattdessen , Startanwendungen wie folgt auszuführen, sobald die Systemlast gesunken ist:

(Bearbeiten: Koushiks Vorschlag hinzugefügt.)

#!/bin/bash
# 
# Delays running an application until the system load has declined.
# 
# Usage:
#   run-when-load-low 'your command here'

echo "export DISPLAY=$DISPLAY; $1 &" | batch

exit 0

Speichern Sie es als ~/bin/run-when-load-lowund fügen Sie es run-when-load-low 'COMMAND'in den Einstellungen für Startanwendungen hinzu.

Hinweise zu dieser Methode:

  • Das obige Skript hat bei mir funktioniert. Es wird nur die DISPLAYUmgebungsvariable an die Anwendung übergeben. Für die meisten Desktop-Anwendungen ist dies alles, was Sie benötigen. Berücksichtigen Sie daher alle Sonderfälle und berücksichtigen Sie diese Tatsache, wenn Sie Fehler beheben, die sich nicht richtig verhalten. Ein guter Ausgangspunkt, wenn Sie der Meinung sind, dass für eine Anwendung möglicherweise andere Umgebungsvariablen übergeben werden müssen, ist printenvdie Dokumentation der Anwendung, obwohl ich persönlich noch nicht auf dieses Problem gestoßen bin.
  • Mein Verständnis des Systemladewerts ist, dass E / A-Wartezeiten berücksichtigt werden, sodass verzögerte Anwendungen nicht versehentlich zu früh gestartet werden sollten, wenn die CPU-Auslastung durch auf E / A wartende Desktop-Prozesse unterbrochen wird. Dies ist jedoch kein Bereich, über den ich viel weiß. Bitte korrigieren Sie mich, wenn ich hier falsch liege.
  • batchwirkt sich nur aus, wenn Anwendungen ausgeführt werden; es ändert nichts an ihrer Priorität / Freundlichkeit.
  • Dies sollte selbstverständlich sein, aber wenn Ihr System immer eine hohe Last hat, werden Anwendungen, die mit dieser Methode geplant wurden, möglicherweise nie ausgeführt.
  • Wenn Sie eine Anwendung mit einem Parameter ausführen müssen, der Leerzeichen enthält, können Sie diese mit dem umgekehrten Schrägstrich maskieren : run-when-load-low 'gedit My\ Notes.txt'. Wenn Sie Ihrer Anwendung wirklich Parameter in einfachen Anführungszeichen übergeben müssen, müssen Sie im Startbefehl doppelte Anführungszeichen verwenden : run-when-load-low "gedit 'My Notes.txt'". Für etwas Komplizierteres ist es wahrscheinlich am besten, wenn Sie nur eine Kopie des Skripts mit Ihrem fest codierten Befehl ändern.
ændrük
quelle
Aendruk, danke. Das klingt nach dem optimalen Ansatz. 2 Zweifel bleiben, ist DISPLAY die einzige Variable, die von Anwendungen aus meiner aktuellen Umgebung benötigt wird, die nicht von weitergegeben werden batch? Ist es auch möglich, dass sich die CPU-Auslastung verringert, bevor der Desktop vollständig geladen wurde (z. B. darauf warten, dass einige Symbole auf die Festplatte geladen werden) und diese Apps gestartet werden, was zu einer ähnlichen Situation wie zuvor führt? Mit anderen Worten, werden die Befehle mit einem Stapel ausgeführt, der von Natur aus eine niedrigere Priorität hat, die sich ergibt, wenn andere Apps ausgeführt werden möchten?
Koushik
@koushik Vielen Dank, dass Sie diese Punkte angesprochen haben. Ich habe meine Antwort aktualisiert, um sie anzusprechen.
ændrük
Genial, ich hatte eine Weile nach einer Lösung für dieses Problem gesucht.
Levesque
1
Dies hilft mir jetzt wirklich, die Zeit für die Anmeldung zu verkürzen. Um immer über den Start dieser Apps auf dem Laufenden zu bleiben, habe ich Ihr Skript leicht geändert, um mich darüber zu informieren, wann diese Apps tatsächlich ausgeführt werden. Wenn der Prozess nicht in den Hintergrund verschoben wird, bleibt er in der batchWarteschlange, da er noch ausgeführt wird. Daher habe ich den Prozess auch im Hintergrund gestartet. Die modifizierte Linie ist wie folgt:echo "export DISPLAY=$DISPLAY; notify-send 'Running on Load low' '$1' && $1 &" | batch
Koushik
1
@ ændrük Ich beziehe mich immer auf das Wiki von Greycat, wenn ich mir nicht sicher bin, ob ich zitiere oder andere 'Best Practices'.
Aperson
5

Ich fand, dass sleep 10 && COMMANDes nicht funktionierte , nur den Befehlsnamen zu verwenden. Ich hatte Probleme damit, dass sowohl Conky als auch Xchat zu früh geladen wurden und irgendwie beschädigt wurden. Ich musste ein kleines Skript namens schreiben ~/bin/startupund es einfügen:

#!/bin/bash
sleep 10
xchat &
conky &

Sie müssen die Berechtigungen ändern, damit sie ausgeführt werden können, chmod +x ~/bin/startupund dann einfach den Eintrag für Startanwendungen durch den Befehl ersetzen startup, damit alles im Skript ausgelöst wird.

Sie könnten eine Datei für jede Anwendung haben, wenn Sie so geneigt wären.

Oli
quelle
Außerdem können Sie der Datei oder dem Ordner einen Punkt voranstellen (z. B. ~ / .bin / startup), damit er ausgeblendet ist. Mit anderen Worten, Sie sehen ihn nicht, wenn Sie in Ihren Ordnern in Nautilus usw. suchen (also Strg + H bis umschalten anzeigen)
8128
Ich hatte Probleme mit einer solchen Lösung, manchmal wird es funktionieren, manchmal wird es nicht funktionieren. Außerdem wird der Ruhezustand das Booten Ihres Desktops definitiv verzögern.
Levesque
1
Das sleepwird das Booten nicht verzögern. Startanwendungen sind nicht blockierend, was bedeutet, dass mehrere Dinge gleichzeitig geladen werden können. sleepMit ing kann der Rest des Gnoms die weniger wichtigen Dinge laden und dann laden.
Oli
2

Verwenden Sie den Befehl 'sleep'.

Bearbeiten Sie unter System -> Einstellungen -> Startanwendungen den Befehl für die Programme, auf die Sie verzögern möchten:

sleep 10 && COMMAND

Ersetzen Sie 10 durch die Anzahl der Sekunden, die gewartet werden soll, und BEFEHLEN Sie durch das, was ursprünglich im Befehlsfeld stand.

dv3500ea
quelle
Bitte lesen Sie den vollständigen Fragetext: OP beschwert sich, dass das Starten der Apps zu lange dauert, und fragt nach einer Möglichkeit, sie vom Anmeldevorgang zu "trennen" ("Ich brauche diese Apps nicht, um sofort verfügbar zu sein, aber es wäre gut." wenn sie irgendwann starten "). Wenn Sie einen "Schlaf" davor hinzufügen, wird die Startzeit tatsächlich länger.
Riccardo Murri
Ich habe nicht bemerkt, dass der Anmeldevorgang auf den Abschluss jedes Befehls gewartet hat. Vielleicht COMMAND &würde es funktionieren, wenn Sie nur (im Hintergrund ausführen) verwenden.
dv3500ea
1
Entschuldigung, mein Fehler: Der Anmeldevorgang wartet nicht auf die Rückkehr jedes einzelnen Startbefehls. Leider kann ich meine Ablehnung nicht entfernen, es sei denn, Sie bearbeiten den Fragentext ...
Riccardo Murri