2009-09-29 16 views
7

Quiero ejecutar una secuencia de comandos Perl con algunos while (1) loop en el fondo en una máquina Unix hasta que la mate.¿Cómo puedo seguir ejecutando un programa Unix en segundo plano incluso si cierro la sesión?

Esta es una computadora remota a la que no tengo permisos administrativos (por lo que por alguna razón, no puedo usar Daemon :: Generic :: While1), me conecto a través de SSH, y quiero que continuar corriendo después de cerrar la sesión.

Una forma descubrí es escribir algo como esto a bash:

nohup ./my_script.pl & 

¿Hay alguna otra manera, más preferible hacerlo?

La edición de crontab está prohibida en esa computadora (mientras que la ejecución de fondo y procesos de larga duración no lo está).

Respuesta

17

Mi método preferido, y posiblemente el más fácil, está utilizando screen:

screen -d -m ./myProcess 
+1

Hah. Ya olvidé que alguna vez hice esta pregunta. La pantalla es mi herramienta favorita ahora también :) –

+0

Encontré esta herramienta para salvar vidas recientemente. 'pantalla' te permite regresar al comando y escribir cosas. Esto también funciona perfectamente con SSH. – Kayla

1

Creo que esto debería funcionar desde dentro de su script perl.

$SIG{ HUP } = 'IGNORE'; 

Nota del doc página del manual de nohup dice:

Para ello, nohup establece la señal SIGHUP (3) (`` línea de colgar el terminal '') a ser ignorados, a continuación, ejecuta la utilidad junto con cualquier argumento.

0

Ejecutar el trabajo en el fondo del armazón está bien, dependiendo de la cantidad de trabajo manual que desee para asegurarse de que esté funcionando continuamente.

Usaría el @reboot de crontab (y posiblemente un chequeo regular también). Pero luego debe tener en cuenta que el proceso podría iniciarse varias veces. La forma más simple de manejar eso es tener un archivo de bloqueo. Si el archivo está bloqueado, salga, de lo contrario continúe con la tarea. Recuerde usar cheques sin bloqueo, de lo contrario corre el riesgo de acaparar recursos innecesarios del sistema con procesos muertos.

pantalla también es una opción si está disponible.

crontab + pantalla se pueden combinar.

+0

crontab de edición está prohibido en ese equipo. –

+0

Entonces no puede asegurarse de que el proceso se ejecute de forma continua (es decir, después de reiniciar). la pantalla y nohup/trapping del SIGHUP todavía son formas válidas de hacerlo. – tommym

+0

Un consejo, pregúntele al administrador antes de poner cualquier proceso en segundo plano en esa máquina. Si no se te permite crontab, es posible que a la administración no le guste que vayas por ahí. Tal vez se le permitirá si lo pide amablemente :) – tommym

1

fragmento está en perlipc perldoc:

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

, pero no estoy seguro de si setsid funcionará si no está raíz. Si no, intente doblar dos veces después de cerrar los controles estándar.

algunos enlaces: howto, daemonize

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

Eso es lo que utilizo para mi programa de filtro Sendmail y probablemente la forma más fácil de ir. El módulo está disponible a través de CPAN.

+0

Si no puede usar Daemon :: Generic :: While1 porque no puede instalarlo, ¿por qué Proc :: Daemon funcionaría mejor? ¿Está en la lista de módulos centrales de Perl? De lo contrario, no será de mucha ayuda. –

+0

Lo puedo instalar (modifiqué CPAN para que funcione sin la contraseña de root), pero me dice algo sobre la capacidad de escribir en/var/run –

+0

Hmm ... Miré la fuente y el módulo, en sí mismo, no está intentando escribir en/var/run (al menos en la versión que estoy usando). Es un módulo bastante pequeño, por lo que es posible que desee echarle un vistazo y crear una versión más personal con el código mínimo que necesita. –

6

que necesita para cerrar la salida estándar, stderr, stdin, de lo contrario se obligan todavía a esa específica TTY

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

Esto debe hacer el truco.

+0

¡perfecto! exactamente lo que necesita cuando no hay pantalla – b1r3k

Cuestiones relacionadas