URL: https://www.overclockers.at/linux/bash-script-hilfe-benoetigt_255930/page_1 - zur Vollversion wechseln!
habe meinen 3D drucker mittels ESP8266 transparent wifi serial bridge angebunden und möchte, sobald der esp online ist das pseudotty interface am server dazu erzeugen damit ich den drucker per octoprint ansprechen kann
bis jetzt hab ich das tty immer per hand erzeugt
hab mir jetzt folgendes bash script geschrieben, aber es funzt noch nicht so wie ich mir das vorstelle
Code:#!/bin/bash x=`/bin/ping -c1 10.0.0.111 2>%1 |grep Unreachable` file="/dev/ttyESP" if [ ! "$x" = "" ]; then echo disconnecting && pkill -f "socat pty,rawer,link=/dev/ttyESP,user=octoprint,group=dialout tcp:10.0.0.111:8888" && rm /dev/ttyESP -R elif [[ "$x" = "" && -f "$file" ]]; then echo already running elif [[ "$x" = "" && ! -f "$file" ]]; then echo connecting && socat pty,rawer,link=/dev/ttyESP,user=octoprint,group=dialout tcp:10.0.0.111:8888 & fi
was funzt nicht ? was ist die fehlermeldung ?
Ohne dein lokales Environment in der Hand zu haben, ist es immer schwer, sowas gesundzuflicken - weil man ja nicht ueber Hypothesen, was genau schieflaeuft, iterieren kann.
Kannst du mal herzeigen, was das Script momentan (nicht) tut via cron? (Bonuspunkte fuer einen Durchlauft mit '#!/bin/bash -x' im Shebang.)
Auf welcher Distro laeuft das? Hast du dort systemd?
aso, ja hätte ich noch gneuaer beschreiben sollen
es tut bereits folgendes erfolgreich:
- das tty erzeugen wenn noch nicht vorhanden und per ping erreichbar
- das tty löschen wenn nicht erreichbar
aber die abfrage die feststellen soll ob das tty bereits erstellt ist und erreichbar ist funktioniert nicht, da hupft er immer ins letzte elif rein und versucht es nochmal zu erstellen...
laufen tut das ganze unter debian 10 (systemd vorhanden) in einer hyper-v vm
via cron hab ichs noch garnicht eingebunden, da es ja noch nicht funktioniert...
Zwei Sachen:
1.) "-f" ist der falsche Test fuer ein TTY-File in /dev/:
(Emph. mine)Code:$ help test | grep -- -f -f FILE True if file exists and is a **regular file.**
Code:$ stat /dev/ttyS0 File: /dev/ttyS0 Size: 0 Blocks: 0 IO Block: 4096 character special file Device: 6h/6d Inode: 1127 Links: 1 Device type: 4,40 Access: (0660/crw-rw----) Uid: ( 0/ root) Gid: ( 20/ dialout) Access: 2020-06-13 20:30:05.979999929 +0200 Modify: 2020-06-13 20:30:05.979999929 +0200 Change: 2020-06-13 20:30:05.979999929 +0200 Birth: -
danke! die änderung von -f auf -e did the trick, jetzt funktioniert es wie gewünscht :thumbsup:
Schoen, dass es jetzt funktioniert.
Willst Du dein Script in Sachen Stil auch kritisiert haben, oder ist dir das egal?
spars dir, bin eher der funktionelle typ
geht, passt
Also ich würde die Kritik trotzdem gern lesen, weil ich durch sowas auch immer lern ;-)
+1
Mich interessieren die Anmerkungen vom Prof. Colossus auch.
Also, das Script hat aus meiner Sicht mehrere Probleme auf unterschiedlichen Ebenen.
Echt falsch ist z. B. die stderr-Redirection in dem Call zu ping - der Benutzer dieses Scripts wird eine Datei Namens "%1" im CWD liegen haben. Gemeint ist wohl "2>&1", um stderr auf stdout zu kriegen. (Dieser etwas subtile Bug fuehrt auch dazu, dass das Script wohl immer noch nicht in allen denkbaren Faellen das macht, was der Autor wirklich von ihm haben moechte!)
Ein Stil-Problem, das aber zu einem echten werden kann, ist folgendes: `somecmd` (backticks) statt $(somecmd) zur command substitution zu verwenden ist generell eine schlechte Idee. $() ist besser lesbar, das Konstrukt laesst sich beliebig verschachteln, und Editoren tun sich leichter mit dem Hervorheben der Syntax. Es gibt KEINEN Grund, jemals irgendwo auf das aeltere `` zurueckzugreifen. In ungefaehr 101 von 100 Faellen ist es auszerdem Notwendig, das Expansionskonstrukt in double quotes zu packen, da man sonst von word splitting aufgeblattelt wird. Zusammengefasst als Handlungsempfehlung:
NIEMALS `somecmd`.
QUASI NIEMALS $(somecmd).
QUASI IMMER "$(somecmd)".
Weiters: Konstrukte wie x="$(some command | grep some-string)" sind in den meisten Faellen irgendwo zwischen unnoetig und falsch. In diesem Fall hier geht es nur darum, sicherzustellen, dass "Unreachable" nicht im Output von `ping` vorkommt, was eine nicht ideale Methode ist, ping zu fragen, ob es erfolgreich hat arbeiten koennen. Das wird von allen gesunden Tools durch den exit status besser und eindeutig beantwortet.
Nachdem ein if-block durch eine if-list nach dem if eroeffnet wird, die von der Shell ausgefuehrt wird ([ und [[ sind Programme bzw. built-ins, die einen exit status zurueckgeben, der von if ausgewertet wird!), koennte man das so eleganter loesen:
Code:if ping -c1 -w1 10.0.0.111 &>/dev/null then # code wenn Ziel erreichbar else # code wenn Ziel nicht erreichbar fi
Code:colo@ryzealot[ssh:A]:~ $ systemd-run --user --unit myunit /bin/sleep 3600 Running as unit: myunit.service colo@ryzealot[ssh:A]:~ $ systemctl status --user myunit ● myunit.service - /bin/sleep 3600 Loaded: loaded (/run/user/1000/systemd/transient/myunit.service; transient) Transient: yes Active: active (running) since Sun 2020-06-21 19:24:07 CEST; 26s ago Main PID: 14666 (sleep) CGroup: /user.slice/user-1000.slice/user@1000.service/myunit.service └─14666 /bin/sleep 3600 Jun 21 19:24:07 ryzealot systemd[622]: Started /bin/sleep 3600. colo@ryzealot[ssh:A]:~ $ systemctl stop --user myunit colo@ryzealot[ssh:A]:~ $ systemctl status --user myunit Unit myunit.service could not be found.
Definitiv, vielen dank für die Erklärung!
ja thx, der hint mit systemd ist gut, den kannte ich noch nicht.
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025