• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[Gelöst] Brauche Hilfe mit einem Shell-Script

Spielwurm

Advanced Hacker
Mein Laptop reagiert im Bereitschaftszustand auf die Maus: der Rechner wird wach. Und weil die Maus meist irgendwo auf dem Tisch liegt, wird er oft wach. Ich hab die Stelle gefunden wo es steht:
Code:
/sys/bus/usb/devices/1-8/power/wakeup
Das steht "enabled drin und wenn ich dort reinschreibe:
Code:
echo > /sys/bus/usb/devices/1-8/power/wakeup disabled
hat sich das Problem erledigt.

ich hab es sogar schon geschafft, ein Startscript zu schreiben und zu installieren für Systemctl. Dabei wird das folgende Script ausgeführt:
Code:
#! /bin/bash
echo > /sys/bus/usb/devices/1-8/power/wakeup disabled
und alles ist gut. Alles? Nein, ein kleiner ACPI macht, dass das Verzeichnis
Code:
1-8
nicht immer existiert und oft heißt das passende Verzeichnis
Code:
1-9
.

Wie muss das Script aussehen, damit folgendes passiert:
Code:
Existiert /sys/bus/usb/devices/1-8/power/?
Wenn ja, schreibe echo > /sys/bus/usb/devices/1-8/power/wakeup disabled
Wenn nein, schreibe echo > /sys/bus/usb/devices/1-9/power/wakeup disabled

Spielwurm
 

marce

Guru
... und ich wäre mir schon mal recht sicher, daß es
Code:
echo disabled > /sys/bus/usb/devices/1-8/power/wakeup
heißen sollte...
 

josef-wien

Ultimate Guru
Code:
echo disabled
ist der Aufruf einer Funktion der GNU bash (im vorliegenden Fall, denn das Programm echo aus den GNU coreutils müßte mit Pfad-Angabe aufgerufen werden) mit Übergabe eines Parameters.
Code:
> /sys/bus/usb/devices/1-8/power/wakeup
ist in beiden Fällen eine Anweisung an die GNU bash, die Ausgabe umzuleiten, und die kann am Anfang, in der Mitte oder am Ende stehen.
 

marce

Guru
wieder was gelernt - ich wäre ich 1000 Jahren nicht auf die Idee gekommen, das in der Reihenfolge zu schreiben. Aber ja, wenn man drüber nachdenkt...

Zweckes der Lesbarkeit würde ich trotzdem die andere Variante bevorzugen...
 

abgdf

Guru
Spielwurm schrieb:
Wie muss das Script aussehen, damit folgendes passiert:
Code:
Existiert /sys/bus/usb/devices/1-8/power/?
Wenn ja, schreibe echo > /sys/bus/usb/devices/1-8/power/wakeup disabled
Wenn nein, schreibe echo > /sys/bus/usb/devices/1-9/power/wakeup disabled
Code:
#!/bin/bash

p8dir="/sys/bus/usb/devices/1-8/power"
p9dir="/sys/bus/usb/devices/1-9/power"

if test -e "$p8dir"
then
    echo "disabled" > "$p8dir/wakeup"
else
    echo "disabled" > "$p9dir/wakeup"
fi
Eine udev-Rule wäre die "bessere" Lösung, aber wenn es nach mir ginge, würde es gar keine kryptischen und sich ständig verändernden udev-Rules geben. Ich hab' also vom Prinzip her kein Problem damit, da mit einem Skript direkt reinzuhacken.

Aber prüf' nochmal, ob in den Dateien nicht noch was Anderes, Wichtiges drinsteht. Das "echo >" überschreibt ja die ganze Datei.
 
OP
S

Spielwurm

Advanced Hacker
Jau danke, ich werde beobachten, wie es funktioniert, habe aber keine Zweifel, dass es tut, was es soll.

In den Dateien "wakeup" steht immer nur "enabled" oder "disabled" wie so oft in den /sys-Dateien.

USB-Rules: die habe ich 2 Semester studiert und komme immer noch nicht klar, wahrscheinlich fehlt mir das System dahinter. Mit "systemctl" kam ich schon relativ gut nach nur einem Semester Studium klar. Und weil das klappt, bleibt es jetzt dabei.

Spielwurm
 
OP
S

Spielwurm

Advanced Hacker
Das Aufweckproblem besteht schon länger und bisher war es entweder das eine Verzeichnis oder das andere. Ich hatte das immer wieder von Hand "disabled" und daher weiß ich das. Aber Danke für den Tipp, wenn mir das Problem bei einem anderen Rechner unterkommt, studiere ich noch 2 Semester USB-rules ...

Spielwurm
 

josef-wien

Ultimate Guru
Mir ist nicht klar, welches Studium erforderlich ist, um
Code:
lsusb
auszuführen, die Werte für die Maus zu ermitteln und an Stelle von "045e" (Microsoft Corp.) und "0039" (IntelliMouse Optical) als root in die gegebenenfalls anzulegende Datei /etc/udev/rules.d/99-local.rules zu schreiben:
Code:
# Damit meine Maus mein System nicht aufweckt:
SUBSYSTEM=="usb", ACTION=="add", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="0039", TEST=="power/wakeup", ATTR{power/wakeup}="disabled"
(== bedeutet eine Abfrage auf Übereinstimmung, = ist die Zuweisung eines Werts.) Damit es schon vor dem nächsten Start aktiviert wird, wäre als root der Befehl
Code:
udevadm control --reload-rules
auszuführen und die Maus ab- und anzustecken.
 
OP
S

Spielwurm

Advanced Hacker
War keine ernsthafte Frage, oder? Ich habe keine Ahnung von diesen Regeln, hätte nicht den blassesten Schimmer, was wie geschrieben wird in welcher Reihenfolge mit welcher Syntax usw. Oder wird das verlangt, wenn man Linux benutzt?

Aber wenn ich das jetzt so lese: was ist denn, wenn ich mal eine andere Maus benutze? Dann muss ich die Regel neu schreiben mit anderer Firma und Produkt, oder?

Spielwurm
 

Christina

Moderator
Teammitglied
Spielwurm schrieb:
Ich habe keine Ahnung von diesen Regeln, hätte nicht den blassesten Schimmer, was wie geschrieben wird in welcher Reihenfolge mit welcher Syntax usw.
Das musst du auch gar nicht, dafür gibt es dieses Forum. ;)
Die korrekte "udev-rule" haben dir @josef-wien und @Gräfin Klara (Link oben) schon geschrieben.
Spielwurm schrieb:
was ist denn, wenn ich mal eine andere Maus benutze? Dann muss ich die Regel neu schreiben mit anderer Firma und Produkt
Genau. Wenn du z.B. drei verschiedene Mäuse an diesem Notebook betreibst, legst du in der Datei "/etc/udev/rules.d/90-acpi.rules" drei udev-rules an, die sich nur in Vendor-ID und Product-ID der Mäuse unterscheiden.

Beispiel:
Code:
lsusb
Bus 002 Device 004:  ID 04b4 : 0060 Cypress Semiconductor Corp. Wireless optical mouse 🐭
idVendor und idProduct sind hier die Angabe bei ID 04b4 : 0060.
Diese IDs stammen vom Hersteller selbst, und die werden von allen Betriebssystemen verwendet.
 

abgdf

Guru
josef-wien schrieb:
Und wenn es weder 1-8 noch 1-9 heißt, stehst Du wieder am Anfang Deines Problems.
Ja, und wessen Fehler ist das?
Warum kann dieser udev-Kram die relevanten Systemeinstellungen nicht immer an dieselbe Stelle schreiben, so daß der Benutzer (oder ein Skript des Benutzers) sie da auch findet?
Ich habe den Verdacht, hier geht es mal wieder darum, die Systemeinstellungen zu verschleiern und vage zu machen, und dem Benutzer so die Kontrolle über das System ("the control over his own computing" (Stallman)) zu nehmen. Und das ist klar abzulehnen.
 

Christina

Moderator
Teammitglied
Ich möchte noch was anmerken.
Bevor man mehrere udev-rules für diverse Mäuse anlegt, kann man statt ausprobieren auch vorher nachsehen, ob Linux das bereits automatisch selbst erledigt hat.
So schaue ich nach: (Vielleicht kennt jemand hier einen kürzeren Weg?)
Code:
$ lsusb
Bus 002 Device 004: ID 04b4:0060 Cypress Semiconductor Corp. Wireless optical mouse
Bus 002 und Device 004 werden jetzt benötigt.
Code:
$ udevadm info -q path -n /bus/usb/002/004
/devices/pci0000:00/0000:00:14.0/usb2/2-8
Einfügen: /sys{…}/power/wakeup sowie ein Backslash vor jedem Doppelpunkt.
Code:
$ cat /sys/devices/pci0000\:00/0000\:00\:14.0/usb2/2-8/power/wakeup
Hier ist die "eigene" udev-rule nicht nötig. Wenn der PC trotzdem aus dem Suspend to RAM aufwacht, muss man sich eine ganz andere Lösung überlegen (Link oben) oder die Maus in Sicherheit bringen. Ich lege sie dann unter den PC-Monitor.
 

josef-wien

Ultimate Guru
Christina schrieb:
einen kürzeren Weg
Vielleicht:
Code:
grep . /sys/bus/usb/devices/*/product /sys/bus/usb/devices/*/power/wakeup


Um alle Mäuse zu erwischen:
Code:
SUBSYSTEM=="input", ACTION=="add", ENV{ID_INPUT_MOUSE}=="?*", TEST=="../../../../power/wakeup", ATTR{../../../../power/wakeup}="disabled"
Aber auch das ist nicht in Stein gemeißelt, während der Weiterentwicklung des 3er-Kernel wurde z. B. das "input subsystem" von neben nach unterhalb des "hidraw subsystem" verlegt, was natürlich Auswirkungen auf die Regel hatte. Ich ziehe eine auf die jewelige Maus ausgerichtete Regel vor, bei einem neuen Drucker muß man schließlich auch einmalig etwas tun. Dann fällt mir noch ein, daß bei den Distributionen mit überladener initrd möglicherweise diese neu erstellt werden muß.
 

Christina

Moderator
Teammitglied
Vielen Dank für den Tipp nach grep . /
Das genügt für einen kurzen Überblick.

/sys/bus/usb/devices/2-8 ist nur ein Symlink, hier nach /sys/devices/pci0000\:00/0000\:00\:14.0/usb2/2-8

Linux hat schon so eine "rule", um alle Mäuse zu erwischen (power/wakeup). Aber das klappt in ganz wenigen Fällen nicht, darum auch dieser Thread.
 
Oben