2009-09-29 12 views
7

Ich möchte ein Perl-Skript mit einigen while (1) Schleife im Hintergrund auf einem Unix-Rechner ausführen, bis ich es töten.Wie kann ich ein Unix-Programm im Hintergrund laufen lassen, selbst wenn ich mich abmelde?

Dies ist ein Remote-Computer, zu dem ich keine Administratorrechte habe (aus irgendeinem Grund kann ich nicht Daemon :: Generic :: While1), ich logge mich über SSH, und ich will es zu fahre fort, nachdem ich mich abgemeldet habe.

Ein Weg, fand ich heraus, ist so etwas zu bash schreiben:

nohup ./my_script.pl & 

Gibt es einen anderen, bevorzugten Weg, es zu tun?

Bearbeiten der Crontab ist auf diesem Computer verboten (während Hintergrund und lang anhaltende Prozesse nicht ausgeführt wird).

Antwort

17

Meine bevorzugte Methode, und wohl die einfachste, verwendet screen:

screen -d -m ./myProcess 
+1

Hah. Ich habe schon vergessen, dass ich diese Frage jemals gestellt habe. Bildschirm ist jetzt auch mein Werkzeug der Wahl :) –

+0

Ich fand dieses lebensrettende Werkzeug erst vor kurzem. 'Bildschirm' ermöglicht es Ihnen, in den Befehl zurückzukehren und Dinge einzugeben. Dies funktioniert auch perfekt mit SSH. – Kayla

1

Ich glaube, das sollte in Ihrem Perl-Skript funktionieren.

$SIG{ HUP } = 'IGNORE'; 

Beachten Sie die Manpage doc für nohup sagt:

Um dies zu tun, nohup das SIGHUP Signal setzt (3) (`` Terminal-Linie hangup '') ignoriert werden, dann führt das Dienstprogramm zusammen mit beliebigen Argumenten aus.

0

Das Ausführen des Jobs im Hintergrund von der Shell ist in Ordnung, abhängig davon, wie viel manuelle Arbeit Sie in die Gewährleistung der kontinuierlichen Ausführung investieren möchten.

Ich würde Crontab @ Reboot (und möglicherweise auch eine regelmäßige Überprüfung). Aber dann müssen Sie berücksichtigen, dass der Prozess möglicherweise mehrmals gestartet wird. Der einfachste Weg, dies zu umgehen, ist eine Sperrdatei. Wenn die Datei gesperrt ist, beenden Sie, andernfalls fahren Sie mit der Aufgabe fort. Denken Sie daran, nicht blockierende Prüfungen zu verwenden, sonst riskieren Sie unnötige Systemressourcen mit toten Prozessen.

Bildschirm ist auch eine Option, wenn es verfügbar ist.

crontab + Bildschirm kann kombiniert werden.

+0

Bearbeitung crontab ist auf diesem Computer verboten. –

+0

Dann können Sie nicht sicherstellen, dass der Prozess kontinuierlich ausgeführt wird (d. H. Nach einem Neustart). Bildschirm und Nohup/Trapping der SIGHUP sind immer noch gültige Wege zu gehen. – tommym

+0

Word of advice, fragen Sie den Administrator, bevor Sie Hintergrundprozesse auf dieser Maschine setzen. Wenn du Crontab nicht darfst, mag es Admin nicht mögen, dass du es durchläufst. Vielleicht sind Sie erlaubt, wenn Sie freundlich fragen :) – tommym

1

Snippet ist in perldoc perlipc:

use POSIX 'setsid'; 

sub daemonize { 
    chdir '/'    or die "Can't chdir to /: $!"; 
    open STDIN, '/dev/null' or die "Can't read /dev/null: $!"; 
    open STDOUT, '>/dev/null' 
          or die "Can't write to /dev/null: $!"; 
    defined(my $pid = fork) or die "Can't fork: $!"; 
    exit if $pid; 
    setsid     or die "Can't start a new session: $!"; 
    open STDERR, '>&STDOUT' or die "Can't dup stdout: $!"; 
} 

Aber ich bin nicht sicher, ob setsid wird funktionieren, wenn Sie nicht als root sind. Wenn nicht, versuchen Sie, nach dem Schließen der Standard-Handles doppelt zu verzweigen.

einige Links: howto, daemonize

1
use Proc::Daemon; 
Proc::Daemon::Init; 

Das ist, was ich für meine Sendmail-Filter-Programm verwenden und wahrscheinlich der einfachste Weg zu gehen. Das Modul ist über CPAN verfügbar.

+0

Wenn er Daemon :: Generic :: While1 nicht benutzen kann, weil er es nicht installieren kann, warum würde Proc :: Daemon besser funktionieren? Ist es in der Perl-Kernmodulliste - wenn nicht, wird es nicht viel helfen. –

+0

Ich kann es installieren (ich modifizierte CPAN, um ohne Root-Passwort zu arbeiten), aber es sagt mir etwas über die Fähigkeit in/var/run schreiben –

+0

Hmm ... Ich schaute auf die Quelle und das Modul selbst versucht nicht schreibe nach/var/run (zumindest in der von mir verwendeten Version). Es ist ein ziemlich kleines Modul, daher sollten Sie es sich ansehen und eine persönlichere Version mit dem von Ihnen benötigten Mindestcode erstellen. –

6

Sie müssen stdout schließen, stderr, stdin, sonst werden Sie noch gebunden an diesem speziellen TTY

./my_script.pl >/dev/null 2>&1 </dev/null & 

Dies sollte den Trick tun.

+0

perfekt! genau das, was Sie brauchen, wenn es keinen Bildschirm gibt – b1r3k

Verwandte Themen