¿Puedo redirigir la salida a un archivo de registro y poner en segundo plano un proceso al mismo tiempo?

¿Puedo redirigir la salida a un archivo de registro y poner en segundo plano un proceso al mismo tiempo?

¿Puedo redirigir la salida a un archivo de registro y a un proceso en segundo plano al mismo tiempo?

En otras palabras, ¿puedo hacer algo como esto?

nohup java -jar myProgram.jar 2>&1 > output.log &

¿O no es ese un mandato legal? O necesito moverlo manualmente al fondo, así:

java -jar myProgram.jar 2>$1 > output.log
jobs
[CTRL-Z]
bg 1

Respuesta1

Un problema con su primer comando es que redirige stderr a donde está stdout (si cambió $ a & como se sugiere en el comentario) y luego redirige stdout a algún archivo de registro, pero eso no arrastra el stderr redirigido. . Debe hacerlo en el otro orden, primero envíe stdout a donde desea que vaya y luego envíe stderr a la dirección en la que se encuentra stdout.

some_cmd > some_file 2>&1 &

y luego podrías lanzar & para enviarlo a un segundo plano. Se puede acceder a los trabajos con el jobscomando. jobsle mostrará los trabajos en ejecución y los numerará. Luego, podría hablar de los trabajos usando un% seguido de un número similar kill %1.

Además, sin el & al final, puede suspender el comando con Ctrlz, utilizar el bgcomando para ponerlo en segundo plano y fgvolver a ponerlo en primer plano. En combinación con el jobscomando, esto es poderoso.

para aclarar la parte anterior sobre el orden en que escribe los comandos. Supongamos que stderr es la dirección 1002, stdout es la dirección 1001 y el archivo es 1008. El comando se lee de izquierda a derecha, por lo que lo primero que ve en el suyo es 2>&1qué mueve stderr a la dirección 1001, luego ve > filequé mueve stdout a 1008, pero mantiene stderr en 1001. No extrae todo lo que apunta a 1001 y lo mueve a 1008, sino que simplemente hace referencia a stdout y lo mueve al archivo.
Al revés, mueve stdout a 1008 y luego mueve stderr al punto al que apunta stdout, 1008 también. De esta manera ambos pueden apuntar al único archivo.

Respuesta2

java -jar myProgram.jar &> output.log &

Tenga en cuenta que &>dirige tanto stdout como stderr a output.log

Respuesta3

Detenerse con <Ctrl+Z>y continuar en segundo plano con bgequivale a ejecutar con &al final del comando.

Entonces, para ejecutar en segundo plano y redirigir la salida:

java -jar myProgram.jar 2> errorOutput.log > output.log &

Si también necesitas que este comando no muera cuando sales de la terminal, entonces debes usarnohup

Respuesta4

En lugar de usar nohup puedes usar screen. Podrás ver el estado del programa en tiempo real. incluso puedes registrar toda la salida en un archivo. Es útil cuando accede al servidor a través de ssh y se desconecta debido a una mala conexión o inactividad. Después de iniciar sesión podrás continuar el trabajo desde donde lo dejaste. referirseesteyestepara saber en detalle.

información relacionada