Schrift
[thread]11402[/thread]

Systemaufruf, kehrt nicht zurück

Leser: 1


<< |< 1 2 >| >> 16 Einträge, 2 Seiten
theresa
 2008-03-03 15:45
#106586 #106586
User since
2007-07-17
90 Artikel
BenutzerIn
[default_avatar]
Hallo,
habe gerade ein Problem mit einem Systemaufruf. Das Programm, das ich mit system bzw `` aufrufe, kehrt nicht zurück...
Es geht um eine vpn-verbindung, der Befehl klappt, also man kann die Verbindung damit aufbauen, aber danach kommt keine Eingabeaufforderung mehr. Man muss eine zweite cmd öffnen um die Verbindung wieder zu trennen.

Mit perl ist das ein Problem, denn nach dem Aufbau der Verbindung will ich andere Sachen machen. Der bleibt dann da aber stehen und wartet.

Zusätzlich kommt dass wenn man falsche Login-Daten eingibt, die Verbindung nicht aufgebaut werden kann. Dann muss ich die Rückgabe vom Befehl vearbeiten können.

Also... muss es programmieren so dass es es versucht wird die Verbindung aufzubauen. Wenn eine Rückgabe vorliegt (Fehler), dann wird sie auch behandelt, wenn das Programm aber nicht zurückkehrt (Verbindung war erfolgreich), dann muss halt woanders weiter gemacht werden.

Vielleicht geht das mit warten oder so... also 1 Sekunde, z.B. und je nachdem ob eine Rückgabe vorliegt oder nicht... entsprechend reagieren.

Wie kann man so etwas programmieren? oder geht es mit etwas ganz anderes. Vielleicht threads oder so...?
#Kein Kommentar
 2008-03-03 15:53
#106587 #106587
User since
2007-06-09
575 Artikel
HausmeisterIn
[default_avatar]
probier mal:

Code: (dl )
system (1, "program.exe");
Gerade weil wir alle in einem Boot sitzen, sollten wir froh sein, dass nicht alle auf unserer Seite sind
renee
 2008-03-03 15:56
#106588 #106588
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du könntest vielleicht mit alarm (siehe perldoc -f alarm) arbeiten...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
theresa
 2008-03-04 17:13
#106635 #106635
User since
2007-07-17
90 Artikel
BenutzerIn
[default_avatar]
Hi,
Code: (dl )
system (1, "program.exe");
hat bei mir nichts geändert.
alarm war allerdings sehr hilfreich, habe mit
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 eval {
local $SIG{ALRM} = sub { die "alarm\n" }; # NB \n required
alarm 2;
#my $return = `$text 2>&1`;
my $return = system($text);
# $nread = sysread SOCKET, $buffer, $size;
alarm 0;
};
die if $@ && $@ ne "alarm\n"; # propagate errors
if ($@) {
# timed out
print "\ntimeout, return: " . $return;
}
else {
# didn't
}

es hingekriegt, dass das Programm erstmal weitermacht... brauche aber die Rückgabe von $text. Das hatte ich bislang mit dem auskommentierten Teil hingekriegt also
Code: (dl )
my $return = `$text 2>&1`;
damit scheint aber alarm nicht zu wirken. Brauche die Windows Rückgabe sozusagen.
theresa
 2008-03-04 17:18
#106636 #106636
User since
2007-07-17
90 Artikel
BenutzerIn
[default_avatar]
Es tut mir Leid dass ich ein Bisschen unvorsichtig hier mit dem Kode umgehe (funktioniert/funtioniert nicht) & copy+paste, hatte aber bislang keine Zeit mich mit perl eingehend zu befassen... werde es aber wohl in näherer Zukunft tun müssen, danke für die Hilfe bisher!
theresa
 2008-03-17 15:46
#107128 #107128
User since
2007-07-17
90 Artikel
BenutzerIn
[default_avatar]
Noch immer keine Idee..?
renee
 2008-03-17 16:00
#107129 #107129
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
theresa+2008-03-04 16:13:07--
[...] Brauche die Windows Rückgabe sozusagen.

Was meinst Du damit?
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
moritz
 2008-03-17 16:11
#107130 #107130
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Solange das Programm läuft, kommt es auch nicht zurück, und wird auch keinen Rückgabewert liefern.

Was willst du denn erreichen? Einen Prozess im Hintergrund starten?
theresa
 2008-03-17 16:58
#107136 #107136
User since
2007-07-17
90 Artikel
BenutzerIn
[default_avatar]
Im Prinzip,

Code: (dl )
my $return = `$text 2>&1`;


dann steht in $return die Rückgabe vom Programm. $text startet eine vpn-Verbindung.
Mögliche Rückgaben sind z.B. Syntax-fehler, profil nicht gefunden, verbindung nicht möglich wegen falschen Daten... also alles was in der cmd ausgegeben werden kann, wenn man die Zeile eingibt.

mit
Code: (dl )
my $return = system($text);


wird diese Rückgabe nicht abgefangen.

Mein Problem jetzt ist, dass wenn die Vpn Verbindung aufgebaut wird, dass Programm nicht zurückkehrt. Das Perl-Programm bleibt also da stehen und wartet.

Mit alarm war der Ansatz den Prozess, der gestartet wurde, nach 1 Sekunde abzubrechen (die Verbindung bleibt bestehen, ist also ok), so dass der Skript weitermachen kann.
Aber... alarm scheint nur mit system() zu arbeiten. Nicht mit ``.
Ich brauche unbedingt die Rückgabe, wenn z.B. falsche Daten beim Verbindungsaufbau eingegeben werden, müssen sie auch behandelt werden.
theresa
 2008-03-17 22:45
#107155 #107155
User since
2007-07-17
90 Artikel
BenutzerIn
[default_avatar]
moritz+2008-03-17 15:11:50--
Solange das Programm läuft, kommt es auch nicht zurück, und wird auch keinen Rückgabewert liefern.

Also das Programm kommt zurück, wenn falsche Daten eingegeben werden. Bzw. bei irgendeinem Fehler, z.B. keine Netzverbindung. In diesem Fall muss ich aus der Rückgabe die Fehlernummer rausfischen um entsprechend reagieren zu können. Das war bisher kein Problem, wie ich es oben beschrieben habe.

Wenn das Programm nicht zurück kommt, heißt es merkwürdigerweise dass alles o.k. war, also dass die Verbindung wurde aufgebaut.

In diesem Fall würde erst alarm das Programm erzwingen, zurückzukommen (damit wird die aufgebaute Verbindung nicht gestört), und es kann dann auch weiterlaufen. Im Grunde genommen brauche ich so etwas wie
versuche verbindung aufzubauen
warten
warten abbrechen wenn rückgabe vorliegt (Fehler)
warten abbrechen wenn Zeit abgelaufen (verbunden)

Der Teil mit Fehler geht nicht, da mit alarm (fürs warten) kann die Rückgabe nicht abgefangen werden, zumindest nicht mit system() und wie das ansonsten gehen soll weiß ich nicht.......
<< |< 1 2 >| >> 16 Einträge, 2 Seiten



View all threads created 2008-03-03 15:45.