Cómo uso el comando nohup sin obtener nohup.¿fuera?


Tengo un problema con el comando nohup.

Cuando hago mi trabajo, tengo muchos datos. La salida nohup.se vuelve demasiado grande y mi proceso se ralentiza. ¿Cómo puedo ejecutar este comando sin obtener nohup?¿fuera?

 215
Author: alexwlchan, 2012-05-02

8 answers

Nohup solo escribe a nohup.out si la salida es de otra manera a la terminal. Si redirige la salida del comando a otro lugar, incluido /dev/null, ahí es donde va en su lugar.

 nohup command >/dev/null 2>&1   # doesn't create nohup.out

Si estás usando nohup, eso probablemente significa que quieres ejecutar el comando en segundo plano poniendo otro & al final de todo:

 nohup command >/dev/null 2>&1 & # runs in background, still doesn't create nohup.out

En Linux, ejecutar un trabajo con nohup también cierra automáticamente su entrada. En otros sistemas, notablemente BSD y OS X, que es no es el caso, por lo que cuando se ejecuta en segundo plano, es posible que desee cerrar su entrada manualmente. Si bien cerrar la entrada no tiene ningún efecto en la creación o no de nohup.out, evita otro problema: si un proceso en segundo plano intenta leer algo de la entrada estándar, se detendrá, esperando que lo devuelva al primer plano y escriba algo. Así que la versión extra-segura se ve así:

nohup command </dev/null >/dev/null 2>&1 & # completely detached from terminal 

Tenga en cuenta, sin embargo, que esto no impide que el comando acceda al terminal directamente, tampoco lo elimina del grupo de procesos de su shell. Si desea hacer esto último, puede hacerlo ejecutando disown sin argumento como el siguiente comando, momento en el que el proceso ya no está asociado con un "trabajo" de shell y no tendrá ninguna señales (no solo HUP) reenviadas desde el shell.

Explicación:

En sistemas Unixy, cada fuente de entrada o destino de salida tiene un número asociado llamado "descriptor de archivo", o "fd" para abreviar. Cada programa en ejecución ("proceso") tiene su propio conjunto de estos, y cuando se inicia un nuevo proceso ya tiene tres de ellos abiertos:" entrada estándar", que es fd 0, está abierto para que el proceso lea, mientras que" salida estándar "(fd 1) y" error estándar " (fd 2) están abiertos para que escriba. Si solo ejecuta un comando en una ventana de terminal, entonces de forma predeterminada, cualquier cosa que escriba va a su entrada estándar, mientras que tanto su salida estándar como el error estándar se envían a esa ventana.

Pero puedes pida al shell que cambie dónde apuntan cualquiera o todos esos descriptores de archivo antes de lanzar el comando; eso es lo que la redirección (<, <<, >, >>) y los operadores de tuberías (|) lo hacen.

El tubo es el más simple de estos... command1 | command2 organiza la salida estándar de command1 para alimentar directamente la entrada estándar de command2. Esta es una disposición muy útil que ha llevado a un patrón de diseño particular en las herramientas UNIX (y explica la existencia de error estándar, que permite que un programa envíe mensajes al usuario aunque su salida vaya al siguiente programa en la canalización). Pero solo puede canalizar la salida estándar a la entrada estándar; no puede enviar ningún otro descriptor de archivo a una canalización sin hacer malabares.

Los operadores de redirección son más amigables ya que permiten especificar qué descriptor de archivo redirigir. Así que 0<infile lee la entrada estándar del archivo llamado infile, mientras que 2>>logfile añade el error estándar al final del archivo llamado logfile. Si no especifica un número, la redirección de entrada es por defecto fd 0 (< es lo mismo que 0<), mientras que la redirección de salida es por defecto fd 1 (> es lo mismo que 1>).

También puede combinar descriptores de archivo: 2>&1 significa "enviar error estándar donde quiera que vaya la salida estándar". Eso significa que obtienes un solo flujo de salida que incluye salida estándar y error estándar entremezclados sin forma de separarlos más, pero también significa que puedes incluir error estándar en una tubería.

Así que la secuencia >/dev/null 2>&1 significa "enviar salida estándar a /dev/null" (que es un dispositivo especial que simplemente arroja lo que escriba en él) "y luego enviar error estándar a donde sea que vaya la salida estándar" (que solo nos aseguramos era /dev/null). Básicamente, "tirar lo que este comando escribe en cualquiera de los descriptores de archivo".

Cuando nohup detecta que ni su error estándar ni su salida están conectados a un terminal, no se molesta en cree nohup.out, pero asume que la salida ya está redirigida a donde el usuario quiere que vaya.

El dispositivo /dev/null también funciona para la entrada; si ejecuta un comando con </dev/null, cualquier intento de ese comando de leer desde la entrada estándar se encontrará instantáneamente con el fin del archivo. Tenga en cuenta que la sintaxis merge no tendrá el mismo efecto aquí; solo funciona para apuntar un descriptor de archivo a otro que esté abierto en la misma dirección (entrada o salida). La cáscara te dejará hacer >/dev/null <&1, pero que los vientos crear un proceso con un descriptor de archivo de entrada abierto en un flujo de salida, por lo que en lugar de simplemente golpear el final del archivo, cualquier intento de lectura desencadenará un error fatal de "descriptor de archivo no válido".

 445
Author: Mark Reed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-18 14:05:28
nohup some_command > /dev/null 2>&1&

¡Eso es todo lo que necesitas hacer!

 53
Author: 11101101b,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-22 18:59:45

¿Ha intentado redirigir las tres corrientes de E/S:

nohup ./yourprogram > foo.out 2> foo.err < /dev/null &
 9
Author: Aziz Shaikh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-02 06:41:25

Es posible que desee utilizar el programa de separación. Lo usas como nohup pero no produce un registro de salida a menos que se lo digas. Aquí está la página de manual:

NAME
       detach - run a command after detaching from the terminal

SYNOPSIS
       detach [options] [--] command [args]

       Forks  a  new process, detaches is from the terminal, and executes com‐
       mand with the specified arguments.

OPTIONS
       detach recognizes a couple of options, which are discussed below.   The
       special  option -- is used to signal that the rest of the arguments are
       the command and args to be passed to it.

       -e file
              Connect file to the standard error of the command.

       -f     Run in the foreground (do not fork).

       -i file
              Connect file to the standard input of the command.

       -o file
              Connect file to the standard output of the command.

       -p file
              Write the pid of the detached process to file.

EXAMPLE
       detach xterm

       Start an xterm that will not be closed when the current shell exits.

AUTHOR
       detach was written by Robbert Haarman.  See  http://inglorion.net/  for
       contact information.

Nota No tengo ninguna afiliación con el autor del programa. Solo soy un usuario satisfecho del programa.

 6
Author: Dan D.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-02 06:39:52
sudo bash -c "nohup /opt/viptel/viptel_bin/log.sh $* &> /dev/null"  &

Redirigir la salida de sudo hace que sudo vuelva a solicitar la contraseña, por lo que se necesita un mecanismo incómodo para hacer esta variante.

 3
Author: Kjeld Flarup,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-21 19:37:04

El siguiente comando le permitirá ejecutar algo en segundo plano sin obtener nohup.fuera:

nohup command |tee &

De esta manera, podrá obtener la salida de la consola mientras ejecuta script en el servidor remoto: introduzca la descripción de la imagen aquí

 3
Author: Clownfish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-14 15:01:38

Puedes hacerlo a continuación nohup & > 2 > & 1 & e. g. No tengo ningún comando hup dentro del script . /Runjob.sh > sparkConcuurent.out 2> & 1

 1
Author: Prem S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-17 16:39:31

Si tienes un shell BASH en tu mac / linux delante de ti, prueba los siguientes pasos para entender la redirección prácticamente:

Crear un script de 2 líneas llamado zz.sh

#!/bin/bash
echo "Hello. This is a proper command"
junk_errorcommand
  • La salida de la orden echo entra en STDOUT filestream (descriptor de fichero 1).
  • La salida del comando error entra en STDERR filestream (descriptor de archivo 2)

Actualmente, simplemente ejecutando el script envía tanto STDOUT como STDERR a la pantalla.

./zz.sh

Ahora comience con la redirección estándar:

zz.sh > zfile.txt

En lo anterior, "echo" (STDOUT) entra en el zfile.txt. Mientras que "error" (STDERR) se muestra en la pantalla.

Lo anterior es lo mismo que:

zz.sh 1> zfile.txt

Ahora puede intentar lo contrario y redirigir "error" STDERR al archivo. El comando STDOUT from "echo" va a la pantalla.

zz.sh 2> zfile.txt

Combinando los dos anteriores, se obtiene:

zz.sh 1> zfile.txt 2>&1

Explicación:

  • PRIMERO, envíe STDOUT 1 a zfile.txt
  • ENTONCES, envíe STDERR 2 a STDOUT 1 (usando el puntero & 1).
  • Por lo tanto, tanto 1 como 2 entran en el mismo archivo (zfile.txt)

Eventualmente, puedes empaquetar todo dentro de el comando nohup & para ejecutarlo en segundo plano:

nohup zz.sh 1> zfile.txt 2>&1&
 0
Author: Thyag,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-28 20:22:06