Command Substitution

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
gora
Beiträge: 58
Registriert: 30.04.2004 21:27:43

Command Substitution

Beitrag von gora » 21.01.2008 12:09:16

Ich muss ein Programm unter `<progname>` ausführen, dass leider in einer Endlosschleife rennt. Quasi wie ein Server.
Nun habe ich aber das Problem, dass mein Script genau in dieser Zeile hängen bleibt, da `<progname>` nichts returned.
Wie könnte ich das machen?

Spasswolf
Beiträge: 3472
Registriert: 30.11.2005 10:32:22
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Wald

Beitrag von Spasswolf » 21.01.2008 12:30:06

Wie könnte ich das machen?
Verraten um welches Programm es geht.

gora
Beiträge: 58
Registriert: 30.04.2004 21:27:43

Beitrag von gora » 21.01.2008 12:43:22

Ein eigenes kleines Programm namens uploader, dass regelmäßig ein Bild hochlädt.

Auch als Hintergrundprozess funktioniert es nicht:

Code: Alles auswählen

bash$ `./uploader &`
Die bash kehrt nicht zurück, bevor ich Ctrl + C drücke :-(

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 21.01.2008 12:48:22

Verstehe das Problem nicht ganz.

Aber du kannst das Skript einfach mit ./Skript & oder nohup ./Skript & in den Hintergrund setzen.
Oh, yeah!

gora
Beiträge: 58
Registriert: 30.04.2004 21:27:43

Beitrag von gora » 21.01.2008 13:33:00

Aber der `./uploader` Aufruf blockiert leider trotzdem :-(

Benutzeravatar
mistersixt
Beiträge: 6601
Registriert: 24.09.2003 14:33:25
Lizenz eigener Beiträge: GNU Free Documentation License

Beitrag von mistersixt » 21.01.2008 13:53:01

Wenn ich das richtig verstehe, willst Du innerhalb des Scriptes ein Programm in den Hintergrund schicken, dann muss Du innerhalb des Scripts mit dem & arbeiten, also: /pfad/zum/programm &
Anschliessend sollte das Script weiterlaufen.

Gruss, mistersixt.
--
System: Debian Bookworm, 6.11.x.-x-amd64, ext4, AMD Ryzen 7 3700X, 8 x 3.8 Ghz., Radeon RX 5700 XT, 32 GB Ram, XFCE

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 21.01.2008 13:55:39

Sorry, aber ich verstehe noch immer nicht genau, was du vorhast.

Wenn du dein Skript "normal" ausführst, dann läuft dieses in einer Endlosschleife? Die Shell ist aber dann "blockiert" und du kannst das Skript mit STRG + c abbrechen.

Das möchtest du aber nicht und deshalb willst du das Skript in den Hintergrund setzen?
Oh, yeah!

gora
Beiträge: 58
Registriert: 30.04.2004 21:27:43

Beitrag von gora » 21.01.2008 14:05:56

Nein, ich habe ein kleines Perlscript, das in

Code: Alles auswählen

$ergebnis=`grep -i "$eingabe" bilder.txt`;
die $eingabe verwendet, um in bilder.txt zu suchen.

Nun wollte ich in $eingabe

Code: Alles auswählen

`./uploader`
testweise einfügen, damit dieser ausgeführt wird. Normalerweise würde ja die Rückgabe des uploader's als $eingabe verwendet, doch da er endlos läuft, klappt es nicht.

Ich hoffe das war verständlicher erklärt. Das das Ganze vielleicht keinen Sinn macht, ist mir klar. Aber es würde mich dennoch interessieren, ob es auch ohne Blockieren möglich ist.

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Beitrag von cosmac » 21.01.2008 14:16:18

hi,

wenn uploader nichts ausgibt kann's natürlich nicht gehen. Aber auch wenn
der in bestimmten Abständen eine Zeile ausgibt, kann das Perl-Script doch
nur eine verwenden (die erste oder die letzte).

Vielleicht hilft dir ein fflush(stdout); oder ein fclose(stdout); im uploader.
Beware of programmers who carry screwdrivers.

gora
Beiträge: 58
Registriert: 30.04.2004 21:27:43

Beitrag von gora » 21.01.2008 14:30:58

fflush(stdout) half leider auch nicht.

Und nach dem ersten fclose(stdout) gabs gar keine Ausgaben mehr.

Gibt es eventuell andere Meta-Zeichen als `` mit denen ich einen Befehl ausführen könnte im Perlscript?

Benutzeravatar
detix
Beiträge: 1743
Registriert: 07.02.2007 18:51:28
Wohnort: MK

Beitrag von detix » 21.01.2008 19:09:16

Ist schon lange her mit perl, aber ne Alternative zu `` könnte z.B. das sein

system("echo testdatei | tee testdatei.txt");
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!

gora
Beiträge: 58
Registriert: 30.04.2004 21:27:43

Beitrag von gora » 21.01.2008 20:10:04

Wie du oben aber siehst, wird die $eingabe mit dem umgebenden Code an eine shell umgeben.

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Beitrag von cosmac » 21.01.2008 21:15:03

mal was anderes: eigentlich könntest du doch die Funktionalität
des Scripts gleich in den updater mit einbauen?

noch was anderes: wenn du den updater nicht aus den Script
heraus aufrufst, sondern so

Code: Alles auswählen

updater | perl_script
kann das Script über sein stdin die Ausgabe des updaters lesen,
und zwar zeilenweise, wenn du im updater ein fflush(stdout)
nach jeder Zeile spendierst.

Das Script kann dann in einer Endlos-Schleife jede Zeile einzeln
verarbeiten. Als Shell-Script (wer kann schon Perl) einfach so:

Code: Alles auswählen

#!/bin/sh
while read eingabe; do
   ergebnis=`grep -i "$eingabe" bilder.txt`
done
Beware of programmers who carry screwdrivers.

Antworten