desarrollo-web-br-bd.com

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

¿Puedo redirigir la salida a un archivo de registro y realizar 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 un comando legal? O, ¿necesito moverlo manualmente al fondo, así:

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

Un problema con su primer comando es que redirige stderr a donde está stdout (si cambió $ a 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 stdout está en

some_cmd > some_file 2>&1 &

y luego podrías lanzar el & para enviarlo a un segundo plano. Se puede acceder a los trabajos con el comando jobs. jobs le mostrará los trabajos en ejecución y los numerará. Luego podría hablar sobre los trabajos usando un% seguido del número como kill %1 más o menos.

Además, sin el & al final puede suspender el comando con Ctrlz, use el comando bg para ponerlo en segundo plano y fg para devolverlo al primer plano. En combinación con el comando jobs, 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>&1 que mueve stderr a la dirección 1001, luego ve > file que mueve stdout a 1008, pero mantiene stderr en 1001. No extrae todo apuntando 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 archivo único.

192
Jacob Minshall
Java -jar myProgram.jar &> output.log &

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

20
Abhinav Bhatia

Parando con <Ctrl+Z> y continuar en segundo plano con bg es equivalente 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 necesita que este comando no muera cuando salga de la terminal, entonces debe usar Nohup

15
RSFalcon7

El comando tee también es bastante frecuente.

Nohup Java -jar myProgram.jar | tee output.log &

2
trevorgrayson

En lugar de usar Nohup, puede usar la pantalla. Puede ver el estado del programa en tiempo real. Incluso puede registrar toda la salida en un archivo. Es útil cuando accede al servidor a través de ssh donde cierra la sesión debido a una mala conexión o inactividad. Después de iniciar sesión, puede continuar el trabajo desde donde lo dejó. consulte esto y esto para saber en detalle.

2
Mani