Bash-Skript führt Aktionen nicht deterministisch aus

Bash-Skript führt Aktionen nicht deterministisch aus

Ich habe ein Bash-Skript, das ich beim Systemstart (Ubuntu 10.04) aufrufe: „Startup Applications“.

Skript:

#!/bin/sh

APP1='/home/ipc-display/development/projects/display-mgmt'
LOG='/home/ipc-display/development/projects/bootLog.txt'

cd $APP1/target/scala-2.10
java -jar display-mgmt-1.0.jar &

# Auto Hide Mouse Pointer
/usr/bin/unclutter &

#Start chrome
sleep 5s
/usr/bin/google-chrome --incognito --app=http://192.168.0.100:9000/welcome &

#Bring Chrome to focus
sleep 5s
/usr/bin/wmctrl -a "http://" && 

#FullScreen Chrome
sleep 3s &&
/usr/bin/xdotool key F11

bash

Abgesehen von meinen SCHRECKLICHEN Skripting-Fähigkeiten, irgendwelche Ideen, warum Chrome nicht IMMER deterministisch in den Vollbildmodus wechselt, wie ich es erwarte?

Ich kann mir nicht erklären, warum es manchmal, aber nicht immer, auf Vollbild umschaltet. Abgesehen davon wäre ich für jede Verbesserung dieses Skripts sehr dankbar.

Danke.

Antwort1

Dies scheint durch ein Timing-Problem verursacht zu werden – möglicherweise wird in den drei Sekunden zwischen dem Fokussieren von Chrome und dem Drücken von etwas in den Vordergrund gerückt F11.

Ich bin nicht sicher, wie wmctrldas funktioniert, aber es scheint ein wenig unpassend, dass Sie &&am Ende dieser Zeile verwenden. Dadurch wird der Prozess nicht in den Hintergrund gestellt, sondern die Shell wird angewiesen, den nächsten Befehl ( sleep 3s) nur auszuführen, wenn der Befehl erfolgreich ist.

Sie können Chrome jedoch --kioskbeim Start einfach im Vollbildmodus verwenden und den Rest des Skripts überspringen.

Antwort2

Ihr Skript sieht gut aus, aber ich glaube nicht, dass Sie so viele sleepAufrufe darin einfügen müssen. Normalerweise verwenden Leute es, sleepum Race Conditions zu umgehen, die dadurch entstehen, dass sie den Abschluss einer asynchronen Aufgabe nicht feststellen können. Wenn Sie beispielsweise ein ausführen, wgetum die Remote-Skriptausführung zu starten und lange genug zu warten, bis der Server eine Datei generiert hat, die sie weiterverfolgen können GET, würden Sie es wahrscheinlich verwenden, sleepum nicht zu wissen, wann diese Datei fertig ist. Es ist etwas umständlich, aber es funktioniert für die Bedürfnisse der meisten Leute.

Ihre sleep's hier ergeben jedoch nicht wirklich Sinn. Ich denke zum Beispiel nicht, dass viel Schaden entsteht, wenn es chromestartet, bevor unclutteres die Chance hat, seine Arbeit zu erledigen. Es gibt auch keine asynchrone Aufgabe, auf deren Abschluss Sie warten wmctl(es ist zwar IPC beteiligt, aber ich glaube nicht, dass wmctles zurückkehren würde, bevor die Kommunikation bereits beendet ist), daher erscheint das Einfügen von drei Sekunden sleepübertrieben. Ich würde jedoch denken, dass jede beliebige Menge sleepunnötig wäre.

Antwort3

Ich weiß nicht, ob das Ihr Problem ist, aber das Ändern des aktiven Fensters ist unzuverlässig: Etwas anderes könnte das aktive Fenster während Ihres Schlafs ändern. Stattdessen sollten Sie anweisen, xdotoolden Schlüssel an das gewünschte Fenster zu senden.

xdotool search --class Google-chrome -- key F11

Wie l0b0 bemerkte, sollten Sie google-chrome --kiosk …stattdessen wahrscheinlich verwenden.

verwandte Informationen