ubuntuusers.de

Perlscript durch Shellscript im Hintergrund starten

Status: Ungelöst | Ubuntu-Version: Server 14.04 (Trusty Tahr)
Antworten |

gnude

Avatar von gnude

Anmeldungsdatum:
11. Juli 2014

Beiträge: 843

Hallo ich habe ein Perl Script das auf dem Bildschirm eine Ausgabe erzeugt. Nun möchte ich dieses Script allerdings im Hintergrund starten so das es im Shellscript sofort weiter geht und die Ausgabe unterdrücken bzw. sie soll nicht angezeigt werden. Beispiel:

#!/bin/bash
cd /test
perl /test/perl.pl 123 &
echo "weiter gehts hier ..."

Das Script wird mit einem Parameter aufgerufen. Ich habe schon wie im Beispiel zu sehen ist versucht ein & dahiner zu hängen um es in den Hintergrund zu schrieben was aber nicht geklappt hat. wie kann ich das perl script im Hintergrund starten?

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Wo legst Du denn Dein Skript ab ?? - unter /test/ - also irgendwo direkt unter Root ? Das ist ein etwas eigenwilliger Ort.

Normalerweise würde man sowas nämlich unter seinem eigenen Home-Verzeichnis ablegen, also typischerweise unter /home/gnude/bin/ ...
Das hat ganz nebenbei noch den Vorteil, dass es nach dem nächsten Anmelden direkt automatisch mit im Suchpfad aufgenommen wird, dass Du das Skript also direkt mit seinem Namen perl.pl 123 aufrufen kannst. (klar: Du musst das Skript natürlich vorher "ausführbar" machen, und der Shebang muss auch korrekt sein)

Ansonsten ist das schon ganz richtig, mit dem & dahinter: das sollte jedenfalls klappen. Und wenn Du dann noch die Ausgabe des Skripts ins Nirvana schicken willst, leitest Du sie einfach dorthin um:

1
perl /test/perl.pl 123  > /dev/null  &

Ich sehe also im Moment keinen Grund, weshalb das bei Dir nicht klappen sollte. Vielleicht verrätst Du noch etwas mehr zu dem Perl-Skript ? (nicht das da noch eine Tücke liegt, die ich nicht auf dem Schirm habe)

LG,

track

gnude

(Themenstarter)
Avatar von gnude

Anmeldungsdatum:
11. Juli 2014

Beiträge: 843

Das ist nen relativ langes Script das ne Datenbank befüllt. Ich hab es wie beschrieben ausprobiert. Im Hintergrund landet es bereits aber es produziert munter weiter ausgaben.... gibt es nen Perl Parameter was ein Script stumm schaltet?

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11243

Wohnort: München

gnude schrieb:

Ich hab es wie beschrieben ausprobiert. Im Hintergrund landet es bereits aber es produziert munter weiter ausgaben....

Das Beispiel von track leitet ja nur stdout um, stderr kannst du ebenfalls umleiten - lies am besten mal Shell/Umleitungen, damit du den Zusammenhang verstehst:

1
perl /test/perl.pl 123 > /dev/null 2>&1  &

gibt es nen Perl Parameter was ein Script stumm schaltet?

Nein, dazu müsstest du dir das Skript ansehen und herausfinden, wer da die Meldungen produziert.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13166

gnude schrieb:

Das Script wird mit einem Parameter aufgerufen. Ich habe schon wie im Beispiel zu sehen ist versucht ein & dahiner zu hängen um es in den Hintergrund zu schrieben was aber nicht geklappt hat.

Was genau bedeutet das? Was hat nicht geklappt?

wie kann ich das perl script im Hintergrund starten?

Genau so, wie Du es gemacht hast plus die Umleitungen für die Unterdrückung der Ausgabe. Ich würde auch noch Stdin schließen:

1
2
3
4
5
6
#!/bin/sh
cd /test
perl /test/perl.pl 123 >/dev/null 2>&1 0<&- &
bg_pid=$!
echo "weiter gehts hier ..."
kill -TERM $bg_pid

Anmerkungen

  • sh reicht

  • Stdin geschlossen

  • PID des Prozesses gerettet ...

  • ... falls man ihn mal killen will

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17599

Wohnort: Berlin

rklm schrieb:

1
2
3
4
5
6
#!/bin/sh
cd /test
perl /test/perl.pl 123 >/dev/null 2>&1 0<&- &
bg_pid=$!
echo "weiter gehts hier ..."
kill -TERM $bg_pid

Anmerkungen

  • sh reicht

  • Stdin geschlossen

  • PID des Prozesses gerettet ...

  • ... falls man ihn mal killen will

Killt das nicht das Perlscript, wenn es länger dauert, als das echo Weiter gehts hier ... immer?

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11243

Wohnort: München

Ich verstehe das sowie so nicht, warum man das Skript in den Hintergrund schicken muss - wenn das ein lang laufender Prozess ist, kann man das wunderbar mit Upstart bzw. Systemd (ab Ubuntu 16.04) starten, dann braucht man den Shell-Zirkus drum herum erst gar nicht und das Logging ist einfacher.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13166

user_unknown schrieb:

rklm schrieb: [...]

Killt das nicht das Perlscript, wenn es länger dauert, als das echo Weiter gehts hier ... immer?

In diesem Skript ja. Aber ich hatte angenommen, dass längere Aktivitäten dort hingehören, wo das echo steht, und wollte zeigen, wie man dann sicherstellt, dass der Prozess gekillt wird, wenn das Skript terminiert. Ist natürlich spekulativ, aber warum sollte man etwas im Hintergrund ausführen, wenn man nicht im Vordergrund weiter arbeiten möchte? Man kann natürlich auch umgekehrt mit wait darauf warten, dass der Kindprozess fertig ist, bevor man das Skript verlässt. Hängt halt davon ab, was man will. Wir wissen ja nicht viel...

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17599

Wohnort: Berlin

rklm schrieb:

aber warum sollte man etwas im Hintergrund ausführen, wenn man nicht im Vordergrund weiter arbeiten möchte?

Es ist ja klar, dass er im Vordergrund währenddessen weiterarbeiten will. Man will das, weil man 2 Dinge gleichzeitig bearbeiten will, bei denen das zweite nicht auf das erste warten muss, um zu arbeiten, aber das 1. doch fertig gearbeitet werden soll.

Aber gut - während man die Arbeit 2 erledigt lässt man vielleicht Musik mitlaufen (1) und wenn sie aus geht, merkt man so, dass Arbeit 2 fertig ist.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13166

user_unknown schrieb:

rklm schrieb:

aber warum sollte man etwas im Hintergrund ausführen, wenn man nicht im Vordergrund weiter arbeiten möchte?

Ich habe da ein "sonst" vergessen: das sollte heißen "aber warum sollte man sonst etwas im Hintergrund ausführen, wenn man nicht im Vordergrund weiter arbeiten möchte?". Mit anderen Worten, ich habe genau so geschlossen wie Du:

Es ist ja klar, dass er im Vordergrund währenddessen weiterarbeiten will. Man will das, weil man 2 Dinge gleichzeitig bearbeiten will, bei denen das zweite nicht auf das erste warten muss, um zu arbeiten, aber das 1. doch fertig gearbeitet werden soll.

Wobei ich noch ergänzen würde, dass das eigentlich klar ist, aber der OP sich darüber ausschweigt. Wir wissen es also nicht wirklich.

Antworten |