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

116

¿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
djangofan
fuente
2
¿Lo has probado? ¿Qué error obtienes? Además, no estoy seguro de si tiene un error tipográfico o un error en su código. 2>$1probablemente se supone que es 2>&1.
Patrick

Respuestas:

171

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 jobscomando. jobsle mostrará los trabajos en ejecución y los numerará. A continuación, puede hablar sobre los trabajos utilizando un% seguido de un número similar kill %1.

Además, sin el & en el extremo con el que puede suspender el comando Ctrlz, use 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>&1quién mueve stderr a la dirección 1001, luego ve > filequé se 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 archivo único.

Jacob Minshall
fuente
sin embargo, parece que no puedo capturar el pid después de esto$!
chovy
8
También vale la pena señalar: puede usar &> file.outpara redirigir stdin y stdout a un archivo de salida, lo que reduce la posibilidad de un error al colocar 2>&1el lugar incorrecto en su línea de comando.
Dan
14

Parar <Ctrl+Z>y continuar en segundo plano con bges 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

RSFalcon7
fuente
Oh ya veo. ¿Estás diciendo que el '&' char adjunto es redundante?
djangofan
Solo cito la página de manual. Dado que nohup ejecutará el comando en segundo plano de todos modos, parece redundante ejecutar nohup en sí mismo en segundo plano
RSFalcon7
10
nohup no ejecuta el comando en segundo plano, debe &
agregarlo
3
Después de mover un proceso a un segundo plano bg, puede separarlo de su sesión ejecutando disown, lo que hace que el proceso no muera cuando cierra el terminal.
Koen
14
java -jar myProgram.jar &> output.log &

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

Abhinav Bhatia
fuente
3
Una explicación de una línea completará la respuesta.
anaik
2
@ abhisheknaik96 ejecuta el archivo jar y redirige tanto stdin como stderr a output.log y lo convierte en proceso de fondo.
P Pang
2

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 se 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.

Mani
fuente
1

El teecomando también es bastante frecuente.

nohup java -jar myProgram.jar | tee output.log &

trevorgrayson
fuente