Skript das Überblick über andere Skripte schafft

H

H_E_X_E_R

Grünschnabel
Hi Leutz,
ich bin im Skripten leider noch nicht fit. Besonders awk & sed sind noch ein rotes Tuch....
ICh habe das Problem das ich mehrere Shell & Perl Skripte laufen habe die ihrerseits Shell- & Perl- Skripte aufrufen. Ich soll nun mir einen Überblick verschaffen. Da sich diese Abläufe auch noch oftmals ändern brauche ich ein Skript welches automatisch einen "Report" erstellt ---> Beispiel :

"Report Hauptskript 31.05.2006"
-> Hauptskript.sh
-->Nebenskript.sh
-->Unternebenskript.pl
-->Wasweisich.pl
-->nocheins.sh
-->schonwiedereins.sh
-->zweitesnebenskript.pl

vielleicht kann auch das ende der skripte mit "reportet" werden:

Habe mir schon etwas einfallen lassen aber ... die Regulären Ausdrücke...

#!/usr/bin/perl
@Zeilen = ("");
open(SKRIPT, "<$ARGV[0]") || die "Fehler!";
print $ARGV[0], "--geoeffnet!-------\n";
while(<SKRIPT>)
{
push(@Zeilen,$_);
}
close(SKRIPT);
for(@Zeilen)
{
if(/.sh/)
{
print $_;
# hier müsste der Skriptname separiert werden
# und anschl. das Skript geöffnet werden und genau wie
# hier (in diesem Skript) verfahren werden (rekursiv)
#
}
}

----------------
die Zeilen im Skript sehen in etwa so aus(runRecompileInvalid.sh ->müsste separiet werden):

write_log $LOG "--- calling recompile views and procedures"
execute_package "TRUE" "$PATH_BASE/preLoad/recompileInvalid" "runRecompileInvalid.sh"
write_log $LOG "--- returning from recompile views and procedures"

Kann mir jemand weiterhelfen ?
 
Hallo

Ich werde dir jetzt nicht deinen Spaß verderben, und das Script für dich schreiben. ;)

Dazu sind mir schon die zu suchenden Kriterien nicht eindeutig genug.
Das kannst nur du am besten wissen.

Aber einen schematischen Vorschlag will ich dir geben.

Wenn ich dich richtig verstehe, suchst du nach Einträgen, die in etwas soetwas wie der use File::Finde;#unter perl
oder include Datei; beinhalten, und willst dann wissen welche Datei diese aufruft.

Korrigier mich, wenn ich das falsch versehe.

Als Einzeiler alle Dateien finden, die use <modulname> benutzen:
Code:
perl -M"File::Find" -le 'find(sub{return if -d;$f=$_;open IN,"<$f";chomp(@in=<IN>);close IN;for $l(@in){print "In $f kommt $& vor" if /use\s.*;?/}},"./")

Nun mal die grobe Erklärung dazu:

Ich lade das Modul File::Finde
Dieses stellt eine Funktion find bereit, die als ersten Parameter eine anonyme Funktion (referenz auf eine Funktion)sub{...}erwartet, und als zweiten das Startverzeichnis "./"
Der Dateiname steht dann in $_
Ich übergehe Verzeichnisse, return if -d ,
speichere den Dateinamen in $f
und öffne diese Datei zum Lesen.
Dann speichere ich die gesamte Datei in @in und entferne gleich die angehängten \n: chomp(@in=<IN>);
Nun durchlaufe ich dieses Array, printe Dateiname und was ich dort gefunden habe, wenn der Regexp erfolgreich war.

print "In $f kommt $& vor" if /use\s.*;?/


Thats all
;)
Ich hoffe du kannst das als Anhaltspunkt nehmen.

Ist natürlich dirty code, soll aber das Prinzip klar machen.
Du musst natürlich eventuell noch testen, ob es die Datei gibt und diverse Fehler abfangen.
Kleiner Tipp:

- Du solltest dir das als Funktionen aufbauen.
- Dann musst du erstmal die Suchkriterien eindeutig anylysieren.
- Mehrere Suchkriterien lassen sich in einem Arryay zusammenfassen, und mittels $suchstring=join "|", @sucharray; zu einem schönen oder Suchstrig zusammenfassen und beim Matcher als Stringvariable einsetzen.if /$suchstring/. Auch beim Ersetzen sehr nützlich als hash.

Zum Verstehen: um z. B. alle Umlaute zu suchen ginge folgendes kleine Konstrukt.
Code:
my @uml=(..);# hier alle Umlaute rein
my $suchstring=join("|", @uml);
....
if /$suchstring/
Das könntest du auf deine gesuchten Dateinamen anwenden.

Hoffe etwas weiter geholfen zu haben.
Stehe für weitere Fragen gerne offen.
:headup:
Gruß Wolfgang
 
Hallo Wolfgang ich danke Dir für deine Antwort,
die Lösung gestaltet sich leider noch etwas schwieriger als ich gedacht habe.
Um das Problem etwas genauer zu beschreiben muss ich weiter ausholen:
AUf unserem Rechenzentrum-Server läuft ein "Nacht-Batch" der in ca. 10 Stunden durchläuft. In diesem Batch werden Umgebungsvariablen gesetzt und 3 Skripte aufgerufen. Diese 3 Skripte rufen widerum Skripte auf 8 das eine 23 das andere und das dritte Skript(Nachverabeitung) 17 weitere Skripte (alles gemischt von Perl .. Shell bis Phyton..
Wenn diese Skripte nicht noch weitere Skripte aufrufen würden, würde ich mir ja die Arbeit machen alles durchzuzählen (gähn) doch leider werden da nochmal andere Skripte aufgerufen....
Zudem soll die Zeit (10 Stunden) auf unter 8 gedrückt werden, damit das Backupfenster noch groß genug ist, um nicht das "Tagesgeschäft" zu stören.
Da von 2 Seiten optiemiert wird ist es schwierig einen Überblick über die Skripte zu bekommen.
Ich brauche eine Zusammenfassung die ausgiebt:
SKRIPT.sh ruft auf:
###skript437.pl, skripr23.sh, skript11.sh
+++SKRIPT437.pl ruft auf:
#####skriptxyz.sh, skript0815.pl, skriptxyz...
++++++SKRIPTXYZ.sh ruft auf:
#################skriptxyz.sh, skript0815.pl, skriptxyz,.........
##########################SKRIPT0815.pl ruft auf:
..........
usw.
so das ich einen Überblick erhalte, welche Skripte (bei der Optimierung) dazukommen oder wegfallen oder welche Skripte besonders oft aufgerufen werden (da sich bei diesen Zeitoptimierungen besonders lohnen).


Ich war jetzt 2 Wochen auf einem Lehrgang (Zertifizierung) habe deshalb das Thema schleifen lassen. Nur soviel habe ich schon begriffen, das es schwierig wird mein Skript "zum Überblick schaffen" rekusiv aufzurufen ...
Weiterhin habe ich das Problem der unterschiedlichen Skripttypen (Shell,Perl,Phyton) so das die Suchmuster nicht überall gleich sein könnten...

Ich muss diese Woche noch einige Sachen aufarbeiten und werden mich nächste Woche noch mal ransetzen. Wenn noch jemand einen Tip hat würde ich mich sehr über einen Thread von Euch freuen.

Besonderen Dank schon mal an Wolfgang, leider bin ich (noch) Lausiger-Anfänger und muss mir deshalb dein Skript noch mal auf der Zunge zergehen lassen... soviel ich aber verstehen suchst dein Einzeiler im Dateisystem (dort liegen alle 260 Skripte nach Programmiersprachen getrennt z.B. /SH/script023.sh,script032.sh.....
/perl/script234.pl,script34.pl.....
usw.
meine Hoffnung ist das ich mit dem Skript die Reihnfolge in der die einzelden Skripte ausgeführt werden zu sehen bekomme...
Daher sollte das Auslesen der Skripte auch in der selben Chronologie wie das Ausführen der Skripte erfolgen (OH Gott was mache ich mit bedingten aufrufen ... wenn Bedingung (eigendlich nie) dann rufe script03.pl auf)..

OK allen Lesern und Thread Postern vielen Dank im Voraus ich lasse von mir hören...


MfG
H_E_X_E_R
 
Etwas quick&dirty, aber vielleicht hilfts Dir. Die Mustererkennung müsste eventuell noch modifiziert werden.

ss.pl:
Code:
#!/usr/bin/perl -w

use strict;
my($script) = @ARGV;
my $pre = '';
open OUTPUT, ">output";
searchscript($script);
close OUTPUT;

sub searchscript {
  my($script) = @_;
  $pre .= '###';
  open FILE, "<$script";
  foreach (<FILE>) {
    if (!/^#/ and (/([\w\-\.\/]+\.sh)/ or /([\w\-\.\/]+\.pl)/)) {
      my $nscript = qx/which $1/;
      chomp $nscript;
      if (-x $nscript) {
          print OUTPUT "$pre $script -> $nscript\n";
          searchscript($nscript)
      }
    }
  }
  close FILE;
  $pre = substr $pre, 0, 3
}

Aufrufen mittels ./ss.pl skriptname. Die Auswertung wird in output geschrieben.

Gruss, Xanti

edit: Suchmuster verfeinert.
 
Zuletzt bearbeitet:
Zurück
Oben