2009-09-29 10 views
7

Voglio eseguire uno script Perl con un po 'di ciclo while (1) in background su una macchina UNIX fino a quando non lo uccido.Come posso continuare a far girare un programma unix in background anche se mi disconnetto?

Questo è un computer remoto a cui non dispongo di autorizzazioni amministrative (quindi per qualche ragione, non posso usare Daemon :: Generic :: While1), accedo ad esso tramite SSH e lo voglio continuare a correre dopo che esco.

Un modo ho scoperto è scrivere qualcosa di simile a bash:

nohup ./my_script.pl & 

C'è qualche altro modo più preferibile per farlo?

La modifica di crontab è vietata su quel computer (mentre non è in esecuzione in background e processi di lunga durata).

risposta

17

Il mio metodo preferito, e probabilmente il più facile, sta utilizzando screen:

screen -d -m ./myProcess 
+1

Hah. Ho già dimenticato di aver mai fatto questa domanda. Lo schermo è anche il mio strumento di scelta :) –

+0

Ho trovato questo strumento di salvataggio proprio di recente. 'screen' ti permette di tornare al comando e scrivere cose. Anche questo funziona perfettamente con SSH. – Kayla

1

Credo che questo dovrebbe funzionare dal tuo script perl.

$SIG{ HUP } = 'IGNORE'; 

Nota la pagina man doc per nohup dice:

A tale scopo, nohup imposta il segnale SIGHUP (3) (`` terminale di linea hangup '') per essere ignorato, poi esegue l'utilità insieme a qualsiasi argomento.

0

L'esecuzione del lavoro in background dalla shell va bene, a seconda della quantità di lavoro manuale che si desidera impostare per assicurarsi che funzioni continuamente.

Vorrei usare crontab's @reboot (e possibilmente anche un controllo regolare). Ma poi è necessario prendere in considerazione che il processo potrebbe essere avviato più volte. Il modo più semplice per gestirlo è avere un file di lock. Se il file è bloccato, esci, altrimenti continua con l'attività. Ricordati di usare controlli non bloccanti, altrimenti rischi di risparmiare risorse di sistema non necessarie con processi morti.

schermo è anche un'opzione se è disponibile.

crontab + schermo può essere combinato.

+0

editing crontab è vietato su quel computer. –

+0

Quindi non è possibile assicurarsi che il processo venga eseguito continuamente (vale a dire dopo un riavvio). schermo e nohup/intrappolare il SIGHUP sono ancora modi validi per andare. – tommym

+0

Word of advice, chiedi all'amministratore prima di inserire qualsiasi processo in background su quella macchina. Se non ti è permesso crontab, l'amministratore potrebbe non apprezzare il fatto di aggirarlo. Forse ti sarà permesso se lo chiedi gentilmente :) – tommym

1

frammento è 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: $!"; 
} 

Ma io non sono sicuro se setsid funzionerà se non sei root. In caso contrario, provare a doppia forchetta dopo aver chiuso le maniglie standard.

alcuni link: howto, daemonize

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

Questo è quello che uso per il mio programma di filtro Sendmail e probabilmente il modo più semplice per andare. Il modulo è disponibile tramite CPAN.

+0

Se non può usare Daemon :: Generic :: While1 perché non riesce a installarlo, perché Proc: Daemon funziona meglio? È nella lista del modulo principale Perl - se no, non sarà di grande aiuto. –

+0

Posso installarlo (ho modificato CPAN per funzionare senza password di root), ma mi dice qualcosa sulla possibilità di scrivere in/var/run –

+0

Hmm ... Ho guardato il codice sorgente e il modulo stesso non sta tentando scrivere in/var/run (almeno sulla versione che sto usando). È un modulo piuttosto piccolo, quindi potresti voler dare un'occhiata e creare una versione più personale con il codice minimo richiesto. –

6

è necessario chiudere stdout, stderr, stdin, altrimenti si sta ancora tenuti a quella specifica TTY

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

Questo dovrebbe fare il trucco.

+0

perfetto! esattamente quello che ti serve quando non c'è schermo – b1r3k

Problemi correlati