User Tools

Site Tools


fore_background_desvincular_procesos_de_la_shell

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
fore_background_desvincular_procesos_de_la_shell [2022/07/08 18:37] – [Conceptos básicos sobre entrada / salida estándar y redirecciones] busindrefore_background_desvincular_procesos_de_la_shell [2024/02/13 17:16] (current) – [Conceptos básicos sobre entrada / salida estándar y redirecciones] busindre
Line 21: Line 21:
 El carácter "&" al final de un comando, no tiene el mismo comportamiento que "Cntrl + Z" o "kill -20" o "kill -19", el "&" no detiene el proceso, simplemente lo deja corriendo en segundo plano. Sería el equivalente a "Cntrl + Z" o "kill -20 XXX" y posteriormente "kill -18 XXX" o "bg X"para reanudarlo. Si la shell es cerrada, el proceso terminará también, al no ser que se ejecute el comando "exit" o "logout" y la opción "huponexit" esté desactivada (comando shopt). El carácter "&" al final de un comando, no tiene el mismo comportamiento que "Cntrl + Z" o "kill -20" o "kill -19", el "&" no detiene el proceso, simplemente lo deja corriendo en segundo plano. Sería el equivalente a "Cntrl + Z" o "kill -20 XXX" y posteriormente "kill -18 XXX" o "bg X"para reanudarlo. Si la shell es cerrada, el proceso terminará también, al no ser que se ejecute el comando "exit" o "logout" y la opción "huponexit" esté desactivada (comando shopt).
  
-Ejecutar un comando en segundo plano tiene como finalidad principal, el ejecutar un comando cuando el usuario necesita salir, pero cerrando la sesión, en inglés "log out" (pts: comando exit / ttys: comando logout). Si el usuario no hace ese "log out", si no que cierra la terminal de golpe, el proceso en segundo plano es también eliminado.+Ejecutar un comando en segundo plano tiene como finalidad principal, el ejecutar un comando cuando el usuario necesita salir, pero cerrando la sesión, en inglés "log out" (pts: comando exit / ttys: comando logout). Si el usuario no hace ese "log out", si no que cierra la terminal de golpe, el proceso en segundo plano es también eliminado.  
 + 
 +Por defecto, en sistemas POSIX, la ejecución de un comando en segundo plano, con "&", sólo desvincula stdin. Por lo tanto stdout y stderr siguen vinculados al shell padre. Ese es el motivo de que algunos comandos o scripts ejecutados en segundo plano continúen enviando su salida a la terminal donde fueron ejecutados.
  
 NOTA: Cuando hay procesos detenidos, la primera ejecución del comando "exit" nos avisará (Hay trabajos detenidos), si repetimos el comando por segunda vez, se cerrará la terminal y los procesos detenidos morirán también. NOTA: Cuando hay procesos detenidos, la primera ejecución del comando "exit" nos avisará (Hay trabajos detenidos), si repetimos el comando por segunda vez, se cerrará la terminal y los procesos detenidos morirán también.
Line 244: Line 246:
 NOTA: No todos los procesos sobreviven al cerrar la terminal, pese a que se haya desvinculado, un ejemplo puede ser tcpdump cuando no se redirige a un fichero la salida. NOTA: No todos los procesos sobreviven al cerrar la terminal, pese a que se haya desvinculado, un ejemplo puede ser tcpdump cuando no se redirige a un fichero la salida.
  
-==== Recuperar la salida de un comando que se ejecuta en segundo plano ====+==== Recuperar la salida (stdout / stderr) de un comando que se ejecuta en segundo plano ====
  
-Si se cerro la terminal donde se puso un programa en segundo plano y además se desvinculó previamente, este quedará en segundo plano funcionando. Reptyr no no sirve aquí ya que se cerró la terminal, pero con un depurador se puede obtener la salida del comando que está en segundo plano (XXX es el PID).+Si se cerro la terminal donde se puso un programa en segundo plano y además se desvinculó previamente, este quedará en segundo plano funcionando. Reptyr no sirve aquí ya que se cerró la terminal, pero con un depurador se puede obtener la salida del comando que está en segundo plano (XXX es el PID).
 <code bash>strace -pXXX -s9999 -e write</code> <code bash>strace -pXXX -s9999 -e write</code>
  
 +
 +Usando Ggb también puede cambiarse el stdout (1) y stderr (2) de un proceso en ejecución.
 +<code bash>
 +# PID: XXXX
 +gdb -p XXXX
 +
 +# Cambiar la salida estándar al fichero /tmp/stdout.
 +p (int)dup2((int)open("/tmp/stdout", 1089, 0777), 1)
 +# Redirige la salida de error a /dev/null.
 +p (int)dup2((int)open("/dev/null", 1089, 0777), 2)
 +# Redireccionando con gdb la salida de error a la terminal virtual /dev/pts/3.
 +p (int)dup2((int)open("/dev/pts/3", 1089, 0777), 2)</code>
 ==== Conceptos básicos sobre entrada / salida estándar y redirecciones ==== ==== Conceptos básicos sobre entrada / salida estándar y redirecciones ====
  
Line 280: Line 294:
 parámetro : c parámetro : c
 </code> </code>
 +
 +** Desactivar / Reactivar la salida estándar y/o de errores en scripts de forma global **
 +
 +<code bash># Redireccionar la salida estándar a /dev/null.
 +exec 1>/dev/null
 +# Redireccionar la salida de errores a /dev/null.
 +exec 1>/dev/null
 +# Redireccionar la salida estándar y de errores a /dev/null.
 +exec 1>/dev/null 2>&
 +
 +# Restaurar la entrada y salida estándar a su comportamiento normal.
 +exec >/dev/tty 2>&1</code>
 +
  
 **Tuberías y el uso de redirecciones**: En algunos casos, el primer comando muestra el resultado deseado como "salida de errores" y las tuberías de manera predeterminada solo redirigen stdin (entrada estándar). Por lo tanto en algunas ocasiones es necesario usar las tuberías de la siguiente manera en combinación con las redirecciones para que todo funcione correctamente. **Tuberías y el uso de redirecciones**: En algunos casos, el primer comando muestra el resultado deseado como "salida de errores" y las tuberías de manera predeterminada solo redirigen stdin (entrada estándar). Por lo tanto en algunas ocasiones es necesario usar las tuberías de la siguiente manera en combinación con las redirecciones para que todo funcione correctamente.
Line 288: Line 315:
 </code> </code>
  
 +**Redirecionar la salida a ficheros encontrados mediante el comando find**.
 +<code bash># En todos los ficheros encontrados agregará una linea en blanco y posteriormente una linea conteniendo variable: "valor"
 +find  . -type f -print0 | xargs -0 -i sh -c ' echo -e "\nvariable: \"valor\"" >> {}'</code>
 ==== Conceptos básicos sobre los IDs asociados a los procesos en Linux ==== ==== Conceptos básicos sobre los IDs asociados a los procesos en Linux ====
    
fore_background_desvincular_procesos_de_la_shell.1657298258.txt.gz · Last modified: 2022/07/08 18:37 by busindre