ubuntuusers.de

Problem mit Nohup in Kombination mit Netcat und Alsa

Status: Ungelöst | Ubuntu-Version: Xubuntu 14.04 (Trusty Tahr)
Antworten |

Yggdrasil

Anmeldungsdatum:
1. Februar 2011

Beiträge: 34

Hallo,

ich habe Schwierigkeiten damit zwei per Pipe verbundene Befehle in einen Hintergrund-Prozess zu verschieben. Starte ich die Programme im Terminal läuft es allerdings. Wie kann ich folgendes ohne interaktive Shell lösen?

Szenario: Senden von Audio-Daten über Netcat (nc) an einen zweiten Rechner.

Mögliche Lösung (hier Client=Server=localhost):

# 1. Warten auf Input auf dem Server
nc -k -l -p 12345 | aplay
# =================
# 2. Loopback Device starten und input versenden.
sudo modprobe snd-aloop
arecord -f cd -D hw:Loopback,1,0 | nc localhost 12345
# =================
# 3. Teststream an neuen Ausgang senden
mplayer -ao alsa:device=hw=Loopback.0.0 -delay 0.3 {Datei}

Starte ich obiges in drei Konsolen, läuft es wie erwartet. Wähle ich aber beispielsweise dieses Konstrukt, um die erste Prozesskette im Hintergrund zu starten

nohup bash -c "nc -k -l -p 12345 | aplay " &

sehe ich beide Programme in der Prozessliste, aber dann kann keine Verbindung (arecord-Zeile…) zu dem Port aufnehmen.

Wie könnte man das (ohne Screen-Session) lösen?

Gruß Yggdrasil

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Kannst Du alle 3 Prozesse nicht gemeinsam in den Hintergrund schicken ? - nur so als Idee.

Also entweder als Skript:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#!/bin/bash

# 1. Warten auf Input auf dem Server
nc -k -l -p 12345 | aplay
# =================
# 2. Loopback Device starten und input versenden.
sudo modprobe snd-aloop
arecord -f cd -D hw:Loopback,1,0 | nc localhost 12345
# =================
# 3. Teststream an neuen Ausgang senden
mplayer -ao alsa:device=hw=Loopback.0.0 -delay 0.3 {Datei}

mit ./mein_nc_skript &
oder in einer Untershell:

( nc -k -l -p 12345 | aplay
sudo modprobe snd-aloop
arecord -f cd -D hw:Loopback,1,0 | nc localhost 12345
mplayer -ao alsa:device=hw=Loopback.0.0 -delay 0.3 {Datei} ) $

Du kannst die beiden Wege ja mal probieren ...

LG,

track

Yggdrasil

(Themenstarter)

Anmeldungsdatum:
1. Februar 2011

Beiträge: 34

Hallo Track,

die drei Zeilen kann und soll man nicht zusammenfassen. Die erste Zeile soll später ja auf einem anderen Rechner ausgeführt werden und blockiert außerdem. Den Rest habe ich nur dazu geschrieben, um ein vollständiges Beispiel anzugeben.

Der Teufel steckt irgendwo im Detail… Beschränke ich den Beispiel auf

1
2
3
4
#!/bin/bash

# 1. Warten auf Input auf dem Server
nc -k -l -p 12345 | aplay

Kann ich es mit './mein_nc_script.sh &' zwar starten, aber es läuft nicht so, wie du (und ich) es vermutlich erwarten würdest:

1. Fall: Nach Starten der Musik, mit den restlichen Befehlen in einem zweiten Terminal, stört jeder Tastendruck im ersten Fenster die Wiedergabe. D.h. da wird irgendwie noch auf die Eingabe zugegriffen.

2. Fall: Bei './mein_nc_script & ; exit; ps -C nc' sehe ich, dass der Prozess läuft, aber ich kann keine Daten an den Port senden.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Ja gut, wenn Du nur einen Teil der Befehle in den Hintergrund schicken willst, nimmst Du eben nur diesen Teil in eine Untershell.

Wichtig ist das mit der Untershell vor allem bei Pipes wie oben Dein

nohup ( bash -c "nc -k -l -p 12345 | aplay " ) &

damit wirklich der ganze Block zusammen bleibt.

Aber im Detail durchblicke ich im Moment auch nicht, wo es genau klemmt ...

LG,

track

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13211

track schrieb:

nohup ( bash -c "nc -k -l -p 12345 | aplay " ) &

Das geht nicht:

1
2
$ nohup ( bash -c "nc -k -l -p 12345 | aplay " )
-bash: syntax error near unexpected token `bash'

So muss man es machen:

1
nohup sh -c "nc -k -l -p 12345 | aplay"

(Hier reicht auch die sh.)

Antworten |