sh/bash: aus pipe ausbrechen?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Fanti
Beiträge: 6
Registriert: 16.06.2017 18:51:48

sh/bash: aus pipe ausbrechen?

Beitrag von Fanti » 26.07.2018 11:40:06

Hallo zusammen,

Zur Zeit versuche einen simplen Listener für eine simple Aufgabe zu bauen:

Code: Alles auswählen

#!/bin/bash
nc -k -l 80 | while read line # 80 nehme ich hier als einfaches Beispiel
do
    echo $line
    kill #### nc-PID?
done

echo "next commands..."
Im Grunde warte ich hier auf ein Auslösewort. Sobald dieses "erklingt"...
(würde ich vielleicht noch gerne etwas zurückschicken)
Möchte ich den Listener Prozess beenden und das Script fortsetzen.

Auf jedenfall würde ich gerne wissen, wie ich diese pipe am saubersten beenden könnte. Die einfachste wäre wohl die PID von NC zu finden und zu "killen".
Problem dabei: wie komme ich an diese PID. "killall nc" könnte wohlmöglich andere NCs beenden.
Deshalb habe es schon mit $! und $$ probiert. Beide sind hierfür aber wohl falsch.


Beste Grüsse und danke für jede Idee :-)


PS: In der bash ist ja schon seit Ewigkeiten (unter Debian) nicht mehr erlaubt auf einem Port zu lauschen. Gerne hatte ich diese auch Möglichkeit genutzt. Aber daran hat sich denke nach wie vor nichts verändert, oder?

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: sh/bash: aus pipe ausbrechen?

Beitrag von heisenberg » 26.07.2018 12:13:34

Code: Alles auswählen

nc .... | while read line ;do
   if irgendwas ; then
       break
   fi
done  
Edit: Hmmm... seltsam nc beendet sich nicht mit dem break.

Dann vielleicht doch eher so:

Code: Alles auswählen

mkfifo $HOME/my.sock
nc.openbsd -k -l -p 1099 >$HOME/my.sock &
nc_pid="$!"

while read line ; do 
   if irgendwas ; then
       kill -TERM "$nc_pid"
   fi
done   <$HOME/my.sock
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

Benutzeravatar
hikaru
Moderator
Beiträge: 13559
Registriert: 09.04.2008 12:48:59

Re: sh/bash: aus pipe ausbrechen?

Beitrag von hikaru » 26.07.2018 12:42:14

heisenberg hat geschrieben: ↑ zum Beitrag ↑
26.07.2018 12:13:34
Edit: Hmmm... seltsam nc beendet sich nicht mit dem break.
Das break ist Teil der while-Schleife, was ein anderer Prozess ist als die nc-Instanz.
Du schneidest mit dem break nur den Schwanz der Pipe ab, der Kopf lebt aber weiter.

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: sh/bash: aus pipe ausbrechen?

Beitrag von heisenberg » 26.07.2018 12:52:06

Ist schon klar. Die meisten Programme beenden sich aber(erfahrungsgemäss), wenn man die while schleife so dahinter setzt, auch wenn ich den technischen Hintergrund da jetzt nicht genau erklären kann.
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

Fanti
Beiträge: 6
Registriert: 16.06.2017 18:51:48

Re: sh/bash: aus pipe ausbrechen?

Beitrag von Fanti » 26.07.2018 12:56:13

Auf jedenfall war mkfifo sehr hilfreich.

Hatte ich bis eben noch nie so benutzt. :-)

Wieder was gelernt. GROSSEN Dank :-)

Funktioniert :-)

PS: Der einzigste Nachteil ist nur das nun NC aktiv bleibt. Sollte das Script unterbrochen wird. Danach ist die PID auch wieder verloren. Das ist aber mehr ein Problem beim Debuggen/Testen gerade. Aber das ist mit anderen Mitteln lösbar.

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: sh/bash: aus pipe ausbrechen?

Beitrag von heisenberg » 26.07.2018 19:29:14

PS: Der einzigste Nachteil ist nur das nun NC aktiv bleibt. Sollte das Script unterbrochen wird. Danach ist die PID auch wieder verloren. Das ist aber mehr ein Problem beim Debuggen/Testen gerade. Aber das ist mit anderen Mitteln lösbar.
Du kannst mit trap einen bash Befehl setzen, der bei bestimmten Signalen ausgeführt wird( z. B. Strg + C => 2 oder SIGINT)

Siehe: man bash
Siehe: man 7 signal
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

Antworten