perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 32
Click for quality!




10.02.2012 / 10:21

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Perl: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


Beitragperl skript starten
Seitenanfang
hallo,

kann mir einer sagen, wie ich mit einem perl skript ein weiteres perl skript aufrufen kann, dabei möchte ich mit dem 1. skript ein paar variablen an das 2. skript beim aufruf übergeben.

geht das? und wie sähe die syntax aus?

danke und gruß

fufu

Datum: 11.01.2006-14:20

Beitragre: perl skript starten
Seitenanfang
hi fufu,

ja, das geht, genauso wie jeden anderen Befehl kannst Du natürlich auch ein Perl skript aufrufen:

mit exec() oder system(), je nachdem, ob Du nach dem Ende des aufgerufenen Skripts wieder zum ersten zurück willst:

skript_1:


#!/usr/bin/perl -w
use strict;

our $var1 = 'abc';

print "in orig\n";
system("perl ./skript_2.pl $var1");
print "in orig again\n";

skript_2:


#!/usr/bin/perl -w
use strict;
my ($newabc) = @ARGV; # können auch mehrere sein
print "in script 2\n";
print "var2: $newabc\n";

ergibt:

in orig
in script 2
var2: abc
in orig again

und wenn Du es statt dessen mit exec() aufrufst, kommt
in orig
in script 2
var2: abc

heraus, da es nicht mehr zu skript_1 zurückkehrt.

Gruss,
svenXY

Datum: 11.01.2006-15:46

Beitragre: perl skript starten
Seitenanfang
achso, ok jetzt ist alles klar! hatte bei der variablen im 2. skript keine klammern drum gesetzt, hab deshalb statt nem string immer den wert 1 übergeben bekommen...

danke für die hilfe!

gruß

fufu

Datum: 12.01.2006-10:18

Beitragre: perl skript starten
Seitenanfang
"hab deshalb statt nem string immer den wert 1 übergeben bekommen..."

klar, weil ARGV ein Array ist und im Skalarkontext ($a = @ARGV) die Anzahl der Elemente des Arrays zurückgegeben wird.

Gruss,
svenXY

Datum: 12.01.2006-11:26

Beitragre: perl skript starten
Seitenanfang
ist es möglich auch eine liste zu übergeben? jedesmal wenn ich das nämlich versuche, kann ich im zweiten skript nur den ersten wert der liste auslesen...

Datum: 16.01.2006-09:38

Beitragre: perl skript starten
Seitenanfang
Hi,

nein, das geht so nicht, da Du eben nicht die Variable übergibst, sondern den Wert als Parameter. Du kannst also so nur einen Skalar übergeben, keinen Hash oder Array

Keine Ahnnung, ob es auch anders geht, vielleicht mit IPC oder so, oder indem Du die Sachen kurz in einer temporären Datei zwischenlagerst.

Warum müssen es denn unbedingt zwei Skripte sein?

Gruss,
Sven

Datum: 16.01.2006-09:45

Beitragre: perl skript starten
Seitenanfang
also es müssen mehrere skripte sein, weil die hier auf verschiedenen system laufen sollen. und es soll halt ein master-skript geben, was die anderen auf den anderen maschinen über eine ssh-verbindung anstößt.

bislang siehts ganz gut aus. hab die parameter jetzt einfach als einzelne variablen übergeben.

Datum: 18.01.2006-15:58

Beitragre: perl skript starten
Seitenanfang
Hi,

wenn Du die Skripte auch noch per ssh auf anderen Maschinen starten willst, bleibt Dir gar keine anderre Lösung als die, die Du jetzt auch benutzt, denn wie sollte ein Prozess auf einer andere Maschine auf einen reservierten Speicherbereich zugreifen können.

Gruss,
Sven

Datum: 18.01.2006-16:10

Beitragre: perl skript starten
Seitenanfang
danke für die antwort!

was würde ich denn in das zweite skript schreiben, damit er die ausgabe auch macht, also wie würde ich die übergebene variable aufrufen?

Datum: 11.01.2006-16:59

Beitragre: perl skript starten
Seitenanfang
Hi,

alles steht eigentlich schon da:

Die Variable wird nicht wirklich übernommen, sondern Du übergibst sie als Parameter im system() Aufruf und "legst" sie im 2. Skript neu an, indem Du sie aus dem Array @ARGV liest.

Wenn Du sie genauso nennst, wie im 1. Skript, dann hast Du eine Kopie (Du kannst sie aber natürlich auch anders nennen).

Die Variable existiert nur innerhalb des ersten Skripts (scope), Du kannst also höchstens den Wert per Parameter an ein anderes Skript übergeben und einer Variablen dort zuweisen.


# in 1:
system("perl mein_script_2.pl $var1");

# in 2:
my ($var1, $var2, ...) = @ARGV;

Gruss,
Sven

Datum: 12.01.2006-09:50

Beitragre: perl skript starten
Seitenanfang
hi,

so ich hab noch eine frage bezüglich der skripte. und zwar möchte ich die ergebnisse, die zwei skripte (auf anderen maschinen) erzeugen über das masterskript ausgeben. d.h. ich müsste sie ja irgendwie zurück geben. ich hab mir jetzt überlegt, ich schreib die ergebnisse in eine text datei und rufe diese dann mit dem masterskript auf. gibt's vllt noch ne einfachere lösung?

Danke und Gruß

fufu

Datum: 27.01.2006-10:36

Beitragre: perl skript starten
Seitenanfang
Hi,

temporäre Dateien würden gehen (aber wie kommt das Masterskript an die Dateien, die ja dann wahrscheinlich auf einem anderen Rechner liegen?).

Möglicherweise kannst Du auch den Output des zweiten Skripts im ersten Skript "anzeigen".

Mit system() bekommst Du nur den Rückgabewert eines Befehls, aber wenn Du den Aufruf in Backticks setzt, oder eine open-Pipe benutzt, könnte es klappen.

Hast Du denn Beispielcode für die zwei Skripte?

Gruss,
Sven

Datum: 27.01.2006-10:51

Beitragre: perl skript starten
Seitenanfang
ok hier mal mein skript aufruf:

system("ssh $passwd\@maschine1 \". /home/abc/.profile; /home/public/Tools/srausch/number_check.pl $number $market_id $typ\"");

problem an der ganzen sach ist ja, dass ich von drei skripten (masterskript und die beiden anderen) ergebnisse zurückliefern muss. die sollen alle möglichst nacheinander angezeigt werden. leider muss ich erst das profil auf den einzelnen maschinen aufgerufen haben, damit ich die skripte da ausführen kann. dieser profilaufruf schreibt dann ganz viel auf den ausgabebildschirm, so dass wenn ich das erste ergebnis bereits ausgegeben habe, es am ende gar nicht mehr zu sehen ist...

wie meinst du das mit den backticks? quasi so:
`system(...)`

ich hab jetzt versucht die temporäredatei auch über ssh aufzurufen:

my $temp = system("ssh $passwd\@maschine1 \" /home/public/Tools/srausch/nummer_output.txt\"");

my $file = "< $temp";
open (file, $file);
print file;
close (file);

aus irgendeinem grund kann der mir den inhalt der datei dann zwar anzeigen, nur leider sagt er gleichzeitig trotzem, dass er sie nicht gefunden hat und dann meckert er noch wegen dem print() on closed filehandle...

Datum: 27.01.2006-11:08

Beitragre: perl skript starten
Seitenanfang
also ich hab da jetzt ne menge rumprobiert und das mit der rückgabe von einem skript zum anderen scheint in perl wirklich nicht vorgesehen zu sein.

allerdings kann man das problem ja auch anders lösen, leider fällt mir hierzu nichts ein!

also das hier ist ja mein aufruf:
system("ssh $passwd\@maschine1 \". /home/abc/.profile; /home/public/Tools/srausch/number_check.pl $number $market_id $typ\"");

dieser teil führt das profil auf der maschine aus:
. /home/abc/.profile;

ohne diesen aufruf kann das skript welches aufgerufen werden soll nämlich nicht ausgeführt werden. problem an der ganzen sache, wenn das profil aufgerufen wird, schreibt es ne menge text auf den bildschirm. bis hierhin nicht weiter tragisch, da dass ergebnis des zweiten skripts ja via print einfach danach ausgegeben wird. allerdings muss ich ja noch ein 3. skript aufrufen, welches wieder ein anderes profil laden muss, d.h. dass das zweite ergebnis am ende zu weit oben auf dem bildschirm dargestellt wird. ich muss es irgendwie hinbekommen, dass die ergebnisse nebeneinander ausgegeben werden. leider weiß ich nicht wie ich dafür sorgen kann, dass der profilaufruf nicht angezeigt wird.

hat da jemand ne idee?

Datum: 30.01.2006-11:20

Beitragre: perl skript starten
Seitenanfang

system("ssh $passwd\@maschine1 \". /home/abc/.profile > /dev/null; /home/public/Tools/srausch/number_check.pl

Datum: 30.01.2006-12:22

Beitragre: perl skript starten
Seitenanfang
danke schön :-)

werd ich gleich mal ausprobieren!

Datum: 30.01.2006-12:49

Beitragre: perl skript starten
Seitenanfang
leider klappt es so nicht, wenn ich noch nen dateinamen dahinter angebe, versucht er das in da reinzuschreiben. leider bekomm ich immer die fehlermeldung, dass die datei nicht erstellt werden konnte. also profil wird momentan nicht ausgegeben, aber halt ne fehlermeldung, dass er nicht in die dateischreiben kann (anlegen tut er sie aber):

system("ssh $passwd\@maschine1 \". /home/abc/.profile > /home/srausch/log.txt; /home/public/Tools/srausch/number_check.pl

Datum: 30.01.2006-14:56

Beitragre: perl skript starten
Seitenanfang
ok, ich hab jetzt noch mal etwas rumgetestet und hab das verzeichnis in dem die textdatei, in die das profil geschrieben werden soll ins gleiche verzeichnis verlegt, wo auch das aufzurufende skript liegt:

system("ssh $passwd\@maschine1 \". /home/abc/.profile > /home/public/Tools/srausch/log.txt; /home/public/Tools/srausch/number_check.pl

der profil-ladevorgang wird nun auch in die datei geschrieben, was ich nur nicht verstehe, es wird auch gleichzeitig aufm bildschirm ausgegeben. müsste das nicht eigentlich umgelenkt werden, momentan wird es ja quasi doppelt augegeben (datei und bildschirm).

Danke und Gruß

FUFU

Datum: 01.02.2006-09:41

Beitragre: perl skript starten
Seitenanfang
Hi fufu,

seltsam, also das Folgende:


system("ssh $user\@$machine $path/echoer > $path/echo.log; $path/script.pl");

funktioniert bei mir wie erwartet: Output von echoer im Log (aber nicht auf dem Bildschirm, output von skript.pl auf dem Bildschirm.

Liegt es vielleicht daran, dass eines Deiner Skripte auf STDERR statt auf STDOUT ausgibt? Dann müsste nach der Umleitung noch ein 2>&1 stehen um STDERR in STDOUT umzuleiten.

Hoffe, es hilft.

Sven

Datum: 01.02.2006-10:10

Beitragre: perl skript starten
Seitenanfang
hm, ne. also die skripte geben alle auf STDOUT aus...

Datum: 01.02.2006-12:52

Beitragre: perl skript starten
Seitenanfang
dann fällt mir auch nix mehr ein, sorry. Wie gesagt, bei mir hier (Linux, bash) funktioniert das wie gewünscht.

Sven

Datum: 01.02.2006-14:07

Beitragre: perl skript starten
Seitenanfang
ne, keine thema, du hast mir schon trotzdem sehr geholfen. ich muss mal gucken ob das hier einer weiss. ich werd bescheid sagen, wenn's dafür ne lösung gibt/woran es jetzt genau liegt.

gruß

fufu

Datum: 01.02.2006-14:10

-






-
-