![¿Puedo redirigir la salida a un archivo de registro y poner en segundo plano un proceso al mismo tiempo?](https://rvso.com/image/31666/%C2%BFPuedo%20redirigir%20la%20salida%20a%20un%20archivo%20de%20registro%20y%20poner%20en%20segundo%20plano%20un%20proceso%20al%20mismo%20tiempo%3F.png)
¿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 jobs
comando. jobs
le 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 bg
comando para ponerlo en segundo plano y fg
volver a ponerlo en primer plano. En combinación con el jobs
comando, 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
qué mueve stderr a la dirección 1001, luego ve > file
qué 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 bg
equivale 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.