¿Qué riesgos existen al detener y reanudar procesos en Linux?

1

Digamos que detengo un proceso usando Ctrl+Zy lo reanudo cinco horas después fg. ¿Qué tan arriesgado es esto con respecto al correcto funcionamiento del proceso?

Por ejemplo, imagine que vimestá trabajando en escribir un archivo grande en el disco, y que lo detengo durante la escritura. ¿ vimAcabaré felizmente escribiendo el archivo cuando lo reanude, sin ningún problema? Como situación extrema, ¿qué sucede si elimino el archivo mientras tanto? ¿Puedo terminar corrompiendo el sistema de archivos? (¿Es posible eliminar un archivo en el que se detuvo la vimescritura, o los controladores del sistema de archivos me impedirán eliminar el archivo hasta vimque termine de escribir en él?)

vimobviamente es una pieza de software relativamente simple, siendo "simplemente" un editor de texto. ¿Puedo detener y reanudar piezas complejas de software como apacheo X11sin esperar demasiados problemas (aparte del tiempo de espera de los clientes, en el caso de Apache)?

haroba
fuente

Respuestas:

6

Básicamente, Ctrl-Z no es algo peligroso. No deberías tenerle miedo.

Lo que sucederá exactamente depende de lo que esté haciendo el proceso. Tus ejemplos son buenos para considerar.

El primero, con vim escribiendo un archivo ... no pasará nada malo. Si aún queda espacio en disco cuando reanude vim, terminará de escribir el archivo. Si matas a vim mientras está suspendido, el archivo se truncará con la cantidad de datos que se habían escrito antes de que se suspendiera (de todos modos, en lo que necesites preocuparte). Si elimina el archivo mientras vim está suspendido, esencialmente vim continuará viendo el archivo todo el tiempo que lo necesite. Desde fuera de vim, el archivo se verá como eliminado, pero vim lo seguirá viendo hasta que termine de escribirse y lo cierre, en ese momento desaparecerá. (Si vim intenta volver a abrirlo, desaparecerá). Después de acostumbrarse a ese último comportamiento, sentirá que está utilizando un juguete tonto cuando Windows bloquea los archivos.

Su segundo ejemplo podría causar problemas. Si hay otros procesos que interactúan con los suyos, todos estarán un poco atascados esperando en esta aplicación. Entonces, sí, se producirán tiempos de espera de los clientes, algunos procesos pueden bloquearse indefinidamente esperando leer datos, etc. Pero aún así no sucederá nada realmente "malo". Nada que deba dañar el sistema, a menos que haya un error en alguna parte. (Por ejemplo, una aplicación mal escrita que no puede manejar el tiempo de espera simplemente se da por vencida y pierde todos sus datos ... pero eso no es culpa de la aplicación que suspendió).

Apache dejaría de servir páginas web, obviamente. X11 dejaría de empujar píxeles. Pero, por lo general, cuando vuelve a iniciarlo, las cosas que estaban bloqueando se reanudarán, y si los clientes han agotado el tiempo de espera, si los reinicia, funcionarán bien nuevamente.

Geoff Gustafson
fuente
1

Unix es un sistema operativo de tiempo compartido, por lo que los programas no obtienen acceso exclusivo a la CPU de todos modos, lo comparten con otros programas y el propio sistema operativo. Cuando suspende un programa, solo está retrasando el tiempo hasta el próximo período de ejecución. Dependiendo del programa, es decir, si es sensible al tiempo como la red o el software de reproducción de video, podría obtener tiempos de espera, pero básicamente no pasa nada malo.

En cuanto a la segunda pregunta sobre la eliminación de un archivo mientras el programa todavía está "ejecutándose", vea la pregunta "¿Cuándo elimina rm los archivos abiertos?" .

Cristian Ciupitu
fuente
-1

Básicamente, depende del programa. Con vim (1) (o con vi (1) ) puede incluso matarlo, y tendrá la posibilidad de recuperar el archivo hasta el momento de la eliminación sin perder datos, incluso si todo el sistema se ha bloqueado (mire la página del comando man vi (1) / vim (1) )

En general, detener un programa durante cinco horas puede tener algunos efectos secundarios que pueden corromper lo que sea que esté haciendo.

Suponga que el programa que tiene abierto es un cliente de red (por ejemplo, una sesión ssh (1) para otra máquina) Normalmente, los servidores activan una opción TCP llamada SO_KEEPALIVE que permite mantener viva la conexión incluso si no tiene nada que decir. En este caso, no duele, ya que el kernel, al tener una conexión TCP abierta, hace que KEEPALIVE sea en nombre del proceso detenido (las conexiones tcp son recursos del kernel, no recursos del proceso del usuario y del usuario) y puede mantener el proceso detenido indefinidamente.

Pero, ¿qué sucede si el servidor intenta enviar algunos datos y el cliente no los reconoce? Quizás el protocolo de la aplicación tiene un tiempo de espera para desconectar una conexión si el cliente no dice nada durante un largo período de tiempo (o el servidor llena todo el búfer de datos para el cliente y no puede bloquear). En ese caso, obtendrá un cliente que intenta usar una conexión que se ha caído hace un tiempo (el servidor se fue).

Entonces la respuesta a esta pregunta es: en general, no hay problema, pero depende exactamente de lo que el programa detuvo necesita de su entorno (duerme, pero el mundo continúa girando)

Luis Colorado
fuente