Font
[thread]5698[/thread]

Befehl system(): Aufruf eines Programms im Perl-Programm

Reader: 1


<< |< 1 2 >| >> 12 entries, 2 pages
hotel_sierra
 2003-09-08 12:06
#85538 #85538
User since
2003-09-08
3 articles
BenutzerIn
[default_avatar]
Hallo Listener

Unterm Betriebssystem Unix soll ein Perl-Programm laufen, welches ein zweites unabhängiges Perl-Programm startet.

Dafür gibt es zwei Programmaufrufe:

exec() und system().

exec() hat den Nachteil, dass das aufzurufende Programm beendet wird.

Im ersten Programm schreibe ich folgende Zeile:

Code: (dl )
print LOG system("/usr/meinBereich/Programm2.pl", $Variable1)."\n";


Im Log des ersten Programms wird mir der Aufruf des zwiten Programms einmal bestätigt.
Im Log des zweiten Programms wird mir geschrieben, dass das Programm zweimal gestartet wird.

Die Prozessanzeige unter Unix bestätigt, dass das zweite Programm zweimal läuft:
Code: (dl )
1
2
3
hose 11775 24182 0 19:27:22 ? sh -c /usr/meinBereich/Programm2.pl "000000000017148"
hose 11777 11693 4 19:27:22 ? /usr/local/bin/perl /usr/meinBereich/Programm2.pl 000000000017148
hose 11776 11775 4 19:27:22 ?/usr/local/bin/perl /usr/meinBereich/Programm2.pl 000000000017148


Wo liegt der Fehler? oder wie kann ich verhindern, dass der Aufruf system() das zweite Programm zweimal startet.

Gruß und im vorraus DANKE

Holger
havi
 2003-09-08 12:09
#85539 #85539
User since
2003-08-04
2036 articles
BenutzerIn
[Homepage]
user image
Der Aufruf scheint ja so ok zu sein!
Poste mal mehr code, oder versuch es zuerst mal mit:
Code: (dl )
print LOG qx("/usr/meinBereich/Programm2.pl", $Variable1)."\n";


Gruss
Relais
 2003-09-08 12:33
#85540 #85540
User since
2003-08-06
2239 articles
ModeratorIn
[Homepage] [default_avatar]
klingt wie dumm verkaufen, isses aber nicht:

- Du hast entweder das Programm zweimal gestartet, oder
- es lief noch eins, bevor Du es zum vermeintlich erstenmal gestartet hast, oder
- der Programm-Teil, in dem Du es startest, wird zweimal durchlaufen (das glaub ich aber nicht, denn es wird ja nicht in den Hintergrund geschickt).
Erst denken, dann posten -- Frankfurt.pm-Treffen am Dienstag 07.01.2020 im Café Diesseits
22. Deutscher Perl-Workshop 04. bis 06.03.2020 in Erlangen.
Frankfurt Perl-Workshop 2020-1 ca. Mai-Juni 2020 im Haus der Jugend

Winter is Coming
Dubu
 2003-09-08 17:03
#85541 #85541
User since
2003-08-04
2145 articles
ModeratorIn + EditorIn

user image
Die beiden Programme haben unterschiedliche Parents. Der eine Parent wird dein Programm1 sein. Versuche den anderen Parent zu finden.
hotel_sierra
 2003-09-08 20:18
#85542 #85542
User since
2003-09-08
3 articles
BenutzerIn
[default_avatar]
1. Zum Vorschlag den Aufruf system() durch den Aufruf qx() auszutauschen hatte den gleichen Effekt.
2. Das Programm1 wurde nicht zweimal gestartet. Der Aufruf des Programms 2 in Programm1 erfolgt gem. man. Log 1 mal.
3. Ich habe noch einmal die Parents überprüft.
   
Code: (dl )
1
2
3
hose 11775 24182 0 19:27:22 ? sh -c /usr/meinBereich/Programm2.pl "000000000017148"
hose 11777 11693 4 19:27:22 ? /usr/local/bin/perl /usr/meinBereich/Programm2.pl 000000000017148
hose 11776 11775 4 19:27:22 ?/usr/local/bin/perl /usr/meinBereich/Programm2.pl 000000000017148

PPID 11693 ist das Programm1.pl und PPID 24182 ist ein Forkdeaemon, der auf dem Unix-System läuft.

Ich weiss ja, dass der Aufruf system() ein Aufruf von fork beinhaltet (gem. PERL IN A NUTSHELL). Aber ich finde trotzdem nicht die Verbindung, weshalb der Aufruf zwei Aufrufe auf Systemebene produziert.
Holger
pq
 2003-09-08 20:36
#85543 #85543
User since
2003-08-04
12204 articles
Admin1
[Homepage]
user image
hmm, das klingt nach kaputtem perl. anders kann ich mir das nicht erklären.
wahrscheinlicher ist aber doch, dass du irgendwas im programm verkehrt
machst, aber ohne den code zu sehen, kann man natürlich keine diagnose
stellen. am besten kürzt du das programm soweit, dass es praktisch nur
noch den system-aufruf macht. wenn der fehler immer noch da ist,
poste den code.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Crian
 2003-09-10 15:02
#85544 #85544
User since
2003-08-04
5854 articles
ModeratorIn
[Homepage]
user image
Höchstwahrscheinlich findest Du aber genau auf diesem Weg den Fehler. Manchmal auch erst, wenn der Forenbeitrag schon wunderbar formuliert ist und man ein letztes Mal alles durchsieht, was dann besonders ärgerlich ist ;-)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
ronald
 2003-09-10 15:23
#85545 #85545
User since
2003-08-15
76 articles
BenutzerIn
[default_avatar]
Warum verwendest du den system()-Befehl mit mehreren Parametern?

Versuch mal
Code (perl): (dl )
print LOG system("/usr/meinBereich/Programm2.pl $Variable1");


Andere Frage noch: Was wird denn in die LOG-Datei geschrieben? Meiner Meinung nach liefert der system()-befehl einen ReturnCode zwischen 0 und 256(??) zurück. Willst du diese Zahl dann protokollieren?
pq
 2003-09-10 17:01
#85546 #85546
User since
2003-08-04
12204 articles
Admin1
[Homepage]
user image
[quote=ronald,10.09.2003, 13:23]Warum verwendest du den system()-Befehl mit mehreren Parametern?[/quote]
perldoc -f system
system() mit mehreren parametern ist generell zu empfehlen, da es keine
extra shell startet.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Dubu
 2003-09-10 19:50
#85547 #85547
User since
2003-08-04
2145 articles
ModeratorIn + EditorIn

user image
[quote=pq,10.09.2003, 15:01]
system() mit mehreren parametern ist generell zu empfehlen, da es keine
extra shell startet.[/quote]
Und man sich das nicht unbedingt triviale Quoten der Parameter spart!
<< |< 1 2 >| >> 12 entries, 2 pages



View all threads created 2003-09-08 12:06.