beste Weg, um unix-Befehle ausführen in ein perl-Skript und zu prüfen, ob es fehlgeschlagen ist
Möchte ich ausführen, ein paar unix-Befehle in perl. Was ist der beste Weg, dies zu tun?
Ist es besser, qx oder system()? Ist es ein guter Weg, um zu überprüfen, wenn es scheitert? Kann mir jemand zeigen, ein gutes Beispiel? Danke.
my $crflag=qx('/bin/touch /tmp/flag.done');
my $chgperm=qx('chmod 755 /tmp/flag.done');
vs.
my $crflag = '/bin/touch /tmp/flag.done';
my $chgperm ='chmod 755 /tmp/flag.done';
system ($crflag);
system ($chgperm);
InformationsquelleAutor jdamae | 2011-03-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es ein paar Probleme mit dem code:
system
, aber diese sind sehr einfache Schritte und sollte wahrscheinlich sein getan direkt in Perl, anstelle von Aufruf aus der shell.touch
ist buchstäblich 1-Aufruf in Perl (2 wenn Sie damit rechnen, schließen Sie die Datei.)0644
statt0755
.In Perl, können Sie lösen Sie alle der oben mit etwas wie dieses:
Kann man dieses in ein Untermenü, mit was auch immer Argumente, die Sie erstellen möchten (viel mehr) atomarer Arbeitsschritt zu vermeiden, andere Prozesse zu stören, die zwischen der großen Anzahl der Anrufe zu berappen zweimal, um die Datei zu erstellen und dann zurücksetzen der Berechtigungen. (Es gibt immer noch Bedenken mit der Synchronisation, so könnte es immer noch sein, vorweggenommen, aber dies ist insgesamt eine weit bessere Lösung.)
Es gibt noch andere flags, die Sie verwenden möchten. Überprüfen Sie
perldoc perlopentut
und Suche fürsysopen
für Sie eine kleine Liste, oder überprüfen Sieperldoc Fcntl
und Ihre Plattform in der Dokumentation eine ausführliche Liste. Sie können auch ändern wollen0644
Berechtigungen zu etwas mehr und weniger restriktiv, und können Sie weiter verwenden möchten, sperren; sieheperldoc -f flock
für Informationen und code-Beispiele auf advisory locking.Fnctl
und bin suchen dieses. Irgendwann ist dieses flag gelesen werden von einem separaten Programm wie eine Anzeige zu starten den Prozess. Also ja, es ist nur eine flag-Datei.Fcntl
ist nur da, weil es die Exporte der KonstantenO_CREAT
,O_EXCL
usw.sysopen
ist ein core perl-Funktion und ist ohne es, aber es ist einfacher zu verwenden, mit den Konstanten. Die oben genannten sollte Ihnen den Einstieg; aber beachten Sie, dassO_EXCL
wird nicht die Datei überschreiben, wenn es bereits vorhanden ist; es loswerden, wenn Sie es wollen zu können. Die Beschreibung inperldoc perlopentut
(untersysopen
) ist vielleicht gründlicher, was jede Konstante hat.InformationsquelleAutor Sdaz MacSkibbons
Neben der Tatsache, dass beide Vorgänge durchgeführt werden kann trivial mit gelieferten
utime
undchmod
, IPC::System::Simple Fehlerüberprüfung.InformationsquelleAutor ikegami
Verwenden
system
zusammen mit$?
. Versuchen Sie zu vermeiden, mitqx
wenn der Ausgang ist nicht erforderlich.$touch_status
und$chmod_status
beide 0 zurückgeben, was bedeutet keine Fehler. So zu überprüfen, Erfolg, würde ich so etwas tunif $touch_status == 0 { print "flag is set";}
?Ich würde sagen, wir bekommen eine viel bessere Kontrolle über
IPC::Run
InformationsquelleAutor Alan Haggai Alavi