Willkommen Gast. Bitte einloggen oder registrieren. Haben Sie Ihre Aktivierungs E-Mail übersehen?
31.07.2021, 04:36:50

.
Einloggen mit Benutzername, Passwort und Sitzungslänge

Mitglieder
  • Mitglieder insgesamt: 25792
  • Letzte: Stefenzo
Statistiken
  • Beiträge insgesamt: 747580
  • Themen insgesamt: 60136
  • Heute online: 271
  • Am meisten online: 2287
  • (22.01.2020, 19:20:24)
Benutzer Online
Mitglieder: 0
Gäste: 157
Gesamt: 157

Autor Thema:  Ideen um bash Script Fehler ab zu gewöhnen. Evtl. Threadfähigkeit nicht gegeben.  (Gelesen 1013 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Das folgende Script läuft erst einmal über Minuten oder Stunden wie es beabsichtigt ist, bringt dann aber nach unbestimmter Laufzeit Fehler, die ich weiter unten beschreibe. Evtl. hat jemand Vorschläge wie man das sauberer programmieren kann, so das unten beschriebene Fehler oder nicht mehr auf treten. Evtl. spielt in dem Fall der Begriff Threadsicherheit eine Rolle ?

Funktion und Zweck des Scripts:
Das Script dient dazu, ohne Zuhilfenahme von Addons und ohne Zuhilfenahme von Python Lösungen, in einem Intervall die in der Adressbar des Firefox stehende URL aus zu lesen, die Domain aus dieser aus zu lesen und die Domain per echo aus zu geben.

#!/bin/bash

while true; do

# markieren der URL in der Adressbar und kopieren der URL in die Zwischenablage
xdotool sleep 0.12 search --onlyvisible --classname Navigator windowactivate --sync key --clearmodifiers --delay 12 F6 Ctrl+c F6 Escape; echo
sleep 1
echo
echo

# übergeben der Zwischenablage an eine Variable
clipboard_url=$( xsel -ob )
echo URL":" "$clipboard_url"
sleep 1
echo
echo

# Extraieren der Domain aus der URL
url=$clipboard_url
domain=$(echo $url | sed -e 's/[^/]*\/\/\([^@]*@\)\?\([^:/]*\).*/\2/')
echo Domain":" $domain
sleep 1
echo
echo

done

Allgemeine Fehlerbeschreibung:
Nach einer unbestimmten Laufzeit des Scripts, bringt das Script bestimmte Effekte. Die Laufzeit nach der diese beginnen auf zu treten, kann Minuten oder Stunden betragen.

Konkrete Fehlerbeschreibung:
Unmotivierte und zum Teil über Minuten oder Stunden anhaltende "Dauerfeuerausgaben" von folgendem im Terminal, oder wohin auch immer für einen ausgebbaren Bereich (z.B. in beliebigen Formularfeld eines beliebigen Programms) von folgenden Zeichen:
Ctrl
l
c
F6

Gerne erzeugt das Script nach unbestimmter Laufzeit, ein dauerhaftes oder unbestimmt langes Drücken der "Strg" Taste.
« Letzte Änderung: 18.01.2021, 14:22:50 von Jan.Tenner »

Ich habe mal testweise beide Varianten zur Übergabe der Zwischenablage an die Variable gegegeneinander getauscht. Das ändert bei mir nicht die Fehlererscheinung.
# clipboard_url=$( xsel -ob )
clipboard_url=`xclip -o -selection clipboard`
echo "$clipboard_url"

Auch das Leeren der Zwischenablage habe ich mal testweise ausgeremmt. Das ändert auch nicht die Fehlererscheinung des Dcripts:
# leeren der Zwischenablage
# xsel -bc && xsel -c
sleep 1
echo
echo

Da das Leeren der Zwischenablage ohnehin nicht wirklich notwendig in dem Script ist, entferne ich das jetzt mal oben aus dem Script.

Testweise habe ich mal die Extraierung der Domain aus der URL durch folgende Variante durch geführt, was jedoch an der Fehlererscheinung auch nichts geändert hat.
domain=$(sed -e 's/[^/]*\/\/\([^@]*@\)\?\([^:/]*\).*/\2/' <<< "$url")
echo $domain


Vorläufige Schlußfolgerung:
Der Fehler liegt, sofern er denn im Script liegt, in folgendem Teil des Scripts:
# markieren der URL in der Adressbar und kopieren der URL in die Zwischenablage
xdotool sleep 0.12 search --onlyvisible --classname Navigator windowactivate --sync key --clearmodifiers --delay 12 F6 Ctrl+c F6 Escape; echo
sleep 1
echo
echo
« Letzte Änderung: 18.01.2021, 14:51:56 von Jan.Tenner »

Möglicherweise solltest Du zuerst mit (xdotool-) search die WindowID des Browsers suchen, dann mit windowactivate aktivieren und erst jetzt (ggf. nach Erfolg-Prüfung) die Keys an die WindowID senden.

Möglicherweise solltest Du zuerst mit (xdotool-) search die WindowID des Browsers suchen, dann mit windowactivate aktivieren und erst jetzt (ggf. nach Erfolg-Prüfung) die Keys an die WindowID senden.
Ich habe da leider nicht genügend Ahnung von. Wenn es allerdings so sein sollte wie ich vermute, hat bei folgendem Beispiel wer das mal so wie du sagst für den Cromium und mit wmctrl gemacht. Allerdings ist es mir bisher nicht gelungen das irgend wie für den Firefox an zu passen. Da fehlen mir eben doch die Kenntnisse.
id=$(wmctrl -l | grep -oP "(?<=)(0x\w+)(?=.*Chromium)") //Put here the regex for the browser you use
xdotool key --window $id "ctrl+l"
xdotool key --window $id "ctrl+c"

Oder ist es so das man obiges was ich nicht für den Firefox angepaßt bekomme, auch an Stelle mit dem "wmctrl" mit "xdotool" machen kann oder besser tun sollte ?

Ich werde mal sehen ob ich aus dem folgenden irgend heraus gelesen bekomme:
* https://unix.stackexchange.com/questions/154546/how-to-get-window-id-from-xdotool-window-stack
* https://stackoverflow.com/questions/34207981/how-do-you-get-window-id-for-xdotool-automatically

Nachtrag:
Möglicher Weise könnte ein verständiger Programmierer folgendes für obige Frage verwerten (ich leider nicht wirklich):
Here is my bash function how to extract a window ID from wmctrl:

#!/bin/bash

# Get the ID of the *first* window with the arguments
# as its window title

function get_dialog_id
{
  echo `wmctrl -l | egrep "$*" | head -n 1 | cut -f 1 -d ' '`
}

I can then feed it to xdotool like:

id=`get_dialog_id "$@"`
xdotool windowactivate $id sleep 0.1 key alt+F4
Quelle: https://github.com/jordansissel/xdotool/issues/79


Nachtrag2:
Mit folgendem scheint man eine ID des Firefox heraus zu bekommen:
xdotool search --name 'Firefox' getwindowpid
Mit folgendem scheint man die IDs der einzelnen Firefox Tabs heraus zu bekommen:
xdotool search --name 'My Window Name'
« Letzte Änderung: 18.01.2021, 20:15:05 von Jan.Tenner »

# markieren der URL in der Adressbar und kopieren der URL in die Zwischenablage
xdotool sleep 0.12 search --onlyvisible --classname Navigator windowactivate --sync key --clearmodifiers --delay 12 F6 Ctrl+c F6 Escape; echo
sleep 1
echo
echo
Beim xdotool Aufruf kann ich direkt keinen Fehler erkennen. Ich würde auf jeden Fall auf das sleep 0.12 verzichten, das erscheint mir unnötig und ggf. noch ein --sync bei search.
xdotool search --sync --onlyvisible --classname "Navigator" windowactivate --sync key --clearmodifiers --delay 12 F6 ctrl+c F6 Escape

xdotool search --sync --onlyvisible --classname "Navigator" windowactivate --sync key --clearmodifiers --delay 12 F6 ctrl+c F6 Escape
Das werde ich gleich mal eine Weile testen. Den "sleep 0.12" hatte ich drin weil ich ein wenig mit dem Wert gespielt habe. Größere Werte wie z.B. 0,5s schienen mir den nicht gewollten Effekt tendenziell häufiger zu machen. Kleiner Werte wie der wenn man nichts konfiguriert , von 12 ms (und ich sehe gerade das mein Eintrag derzeit ja bei 120 ms liegt und nicht wie von mir gedacht auf wie wenn man nichts an gibt, bei 12 ms.

Nun muss ich erst einmal nachlesen, was das "sync" laut Doku bewirkt.

Dein Script hat schon ein sleep in der Schleife, deswegen würde ich bei xdotool darauf verzichten.
Das erste --sync wirkt auf das search - ist vmtl. nicht nötig.

Dein Script hat schon ein sleep in der Schleife, deswegen würde ich bei xdotool darauf verzichten.
Das erste --sync wirkt auf das search - ist vmtl. nicht nötig.

Wenn ich es mir recht überlege, ist daszumindest in der Vergangenheit aufgetretene gelegenliche Dauerfeuer, wie als wenn eine per xdotoool gedrückte Taste manchmal klemmt.

Wenn ich die Laufzeit der Schleife hoch setze, sehe ich, das auch in Zeiten in dene kein Dauerfeuer auf tritt, die Anzahl der Ausgaben die durch xdotool erfolgen, nicht denen des Scripts entspricht. Das kann man daran sehen, das hin und wieder die Adressbar als markiert stehen bleibt, wenn sie es nicht sein sollte. D.h. xdotool hat da entweder mehr oder weniger als eine Markiereng und Entmarkierung der Adressbar mit F6 durchgeführt.

Da xdotool beim Dauerfeuer zu viel sendet, kann es sein das es auch bei nicht Dauerfeuer, hin und wieder etwas zu viel sendet. Zumindest eine falsche Anzahl von F6 Sendungen (markeiren und entmarkieren der Adressbar) findet noch immer statt.

Verstanden habe dich jetzt nicht. Evtl. reagiert dein Browser nicht schnell genug auf die Tastendrücke. Solltest du vielleicht das --delay erhöhen?

Verstanden habe dich jetzt nicht. Evtl. reagiert dein Browser nicht schnell genug auf die Tastendrücke. Solltest du vielleicht das --delay erhöhen?
Obiges Script legte zumindest in der Vergangenheit manchmal eine Dauerfeuerausgabe von wahlweise Ctrl, l, c als auch F6 ein.

Obiges Script legte zumindest in der Vergangenheit manchmal eine Dauerfeuerausgabe von wahlweise Ctrl, l, c als auch F6 ein.
Das hatte ich gelesen. Evtl. gibt es einen Fehler in xdotool und du solltest dort einen Bug aufmachen oder dort mit den Entwicklern diskutieren.

Das hatte ich gelesen. Evtl. gibt es einen Fehler in xdotool und du solltest dort einen Bug aufmachen oder dort mit den Entwicklern diskutieren.
Das kann durchaus sein das es da einen Bug in der Richtung gibt. Bugs kann man wohl bei github melden, wenn man weiß wie man github bedient. Mir ist das nicht klar, sonst hätte ich bei Cinamon auch schon ein paar Sachen eingetragen.

Manche Sachen bei xdtool lassen sich wohl umschiffen, in dem man keydown und keyup verwendet an stelle einen Key zu senden und zu hoffen das das auch so funktioniert. Das habe ich in der Vergangenheit zur Genüge getestet. Und das war zumindest in diesem Fall, nicht oder nicht nur eine Lösung.

Nach der Umänderung auf das folgende Muster. ist das gelegentliche Dauerefeure noch nicht wieder aufgetreten:
xdotool search --sync --onlyvisible --classname "Navigator" windowactivate --sync key --clearmodifiers --delay 12 F6 ctrl+c F6 Escape
Das Aber zumindest die Das F6 markieren und F6 demarkeiren erfolgt noch immer NICHT IMMER in dieser geraden und sich gegeneinander aufhebenden Anzahl.

Da werde ich jetzt mal sehen ob ich da eine Routine einbaue, die wenn meine Routine keine Domainadresse aus gibt, ein F6 zu senden und diese noch einmal zu durchlaufen.
« Letzte Änderung: 18.01.2021, 21:49:43 von Jan.Tenner »

Das Aber zumindest die Das F6 markieren und F6 demarkeiren erfolgt noch immer NICHT IMMER in dieser geraden und sich gegeneinander aufhebenden Anzahl.
Sind die keystrokes alle nötig? Genügt auch nur F6 ctrl+c oder F6 ctrl+c Escape?

Sind die keystrokes alle nötig? Genügt auch nur F6 ctrl+c oder F6 ctrl+c Escape?
Welcher Keystroke könnte eingespart werden ? Ich bin schon ein wenig besoffen ...

Bisher ist der Daufeuerfehler seit der Umstellung auf folgendes nicht aufgetreten:
xdotool search --sync --onlyvisible --classname "Navigator" windowactivate --sync key --clearmodifiers --delay 12 F6 ctrl+c F6 Escape
Nachtrag:
[Jetzt ist es gerade wieder der Fall. Das Script ballert ohne Unterlass ein "^[[17" (was einem F6 entspricht) in die Adressbar des Browsers und nach Setzen des Cursors in das Terminal, nun icn das Terminal !!!

Die aktuellen Versuche bringen also auch keine Genesung.


Irgendwo habe ich mal gelesen das es besser wäre, jeden Aufruf von xdotool. einem eigenen Subprocess ablaufen zu lassen. Möglicher Weise war da etwas mit der Verwendung von einem "$" in der Aufrufzeile von xdotool gemeint.
Eventuell so etwas in der Art:
xdotool key --window "$(xdotool getactivewindow)" F5
Nachtrag:
Anders als ich oben mit roten Lettern behauptet hatte, läuft das Script mit der Änderung von pinky seit >3h ohne für mich im Moment ersichtliche Fehler in der unten dargestellten nooch etwas angepaßten Variante. Als ich oben mit Roter Schrift behauptete das wieder die beschrieben Fehler aufgetreten seien, hatte ich einen Fehler beim Übertragen des Testcodes gemacht und beim Test eine alte, bekannt fehlerbehaftete Version unabsichtlich aufgerufen gehabt.

/bin/bash -c "xdotool sleep 0.12 search --sync --onlyvisible --classname Navigator windowactivate --sync key --clearmodifiers --delay 12 F6 Ctrl+c F6 Escape; echo"
« Letzte Änderung: 19.01.2021, 23:46:23 von Jan.Tenner »

Ich hatte mir so etwas vorgestellt:
#!/bin/bash

# Verzögerungen für xdotool in Sekunden vorgeben
Delay=0.1


# Endlosschleife
while sleep 3s ; do


    # ID auslesen
    WinId="$( xdotool search --onlyvisible --name firefox )"
    sleep $Delay


    # Falls eine Ganzzahl (die WindowID) ausgelesen werden konnte:
    if [[ $WinId =~ ^[0-9]+$ ]]; then

        # Fenster aktivieren, Url markieren und ins Clipboard kopieren
        xdotool windowactivate $WinId
        sleep $Delay
        xdotool key "F6"
        sleep $Delay
        xdotool key "ctrl+c"
        sleep $Delay
        xdotool key "F6"
        sleep $Delay

        # Url ausgeben
        echo $( xclip -o )

        # Clipboard leeren
        xclip -i <<< ""

    else

        echo "Fehler: Es konnte keine ID ausgelesen werden -> Ende"
        exit 1

    fi


done
Blind in Programmfenstern rumklicken zu lassen bleibt aber eine sehr kritische Sache.
« Letzte Änderung: 19.01.2021, 16:56:58 von Nessie »