¿Hay alguna manera de pausar un proceso en ejecución en sistemas Linux y reanudarlo más tarde?


38

Tengo que copiar archivos en una máquina. Y los datos son inmensamente grandes. Ahora los servidores deben servir normalmente, y generalmente hay un rango particular de horas ocupadas en esos. Entonces, ¿hay alguna manera de ejecutar dichos comandos de manera que si el servidor llega a las horas ocupadas, detiene el proceso y, cuando se sale de ese rango, lo reanuda?

Resultado previsto

cp src dst

if time between 9:00-14:00 pause process
After 14:00 resume cp command.

22
rsync puede reanudar transferencias parciales
Thorbjørn Ravn Andersen

2
¿ Necesita que se copien los datos reales como copia de seguridad? Si no es así, ¿podrías usar cp -alpara hacer una granja de enlaces rígidos? ¿O usar un sistema de archivos que admita enlaces de nivel de bloque con copia en escritura, usando cp -a --reflink=auto? BTRFS y ZFS admiten eso para copias dentro del mismo dispositivo físico.
Peter Cordes

99
¿Alguno de los archivos srccambia entre las 9:00 y las 14:00? Si es así, simplemente pausar y reanudar el cpproceso puede resultar en archivos corruptos. Puede ser mejor ejecutar rsyncen combinación con el timeoutcomando.
Mark Plotnick

¿Desde y hacia dónde se copian los archivos? ¿Es este un sistema virtual? ¿Cuál es el sistema de archivos fuente? ¿Cuál es el propósito de la copia?
Braiam

@Braiam Im usando rsync, y copiando archivos de forma remota a la máquina local. Acabo de usar el comando cp como ejemplo aquí por cierto
Sollosa

Respuestas:


8

Sí, usted necesita

acquire the process id of the process-to-paus (PS), then do
$> kill -SIGSTOP <pid>

El proceso se mostrará con el estado "T" (PS). Para continuar hacer un

$> kill -CONT <pid>

¡Buena suerte!


77

Puede pausar la ejecución de un proceso enviándole una señal SIGSTOP y luego reanudarlo enviándole un SIGCONT.

Suponiendo que su carga de trabajo es un proceso único (no bifurca a los asistentes que se ejecutan en segundo plano), puede usar algo como esto:

# start copy in background, store pid
cp src dst &
echo "$!" >/var/run/bigcopy.pid

Luego, cuando comienza el tiempo ocupado, envíele un SIGSTOP:

# pause execution of bigcopy
kill -STOP "$(cat /var/run/bigcopy.pid)"

Más tarde, cuando el servidor esté inactivo nuevamente, reanúdelo.

# resume execution of bigcopy
kill -CONT "$(cat /var/run/bigcopy.pid)"

Tendrá que programar esto para momentos específicos en los que desea que se ejecute, puede usar herramientas como cron o temporizadores del sistema (o una variedad de otras herramientas similares) para programar esto. En lugar de programar en función de un intervalo de tiempo, puede optar por supervisar el servidor (quizás mirando el promedio de carga, el uso de la CPU o la actividad de los registros del servidor) para tomar una decisión sobre cuándo pausar / reanudar la copia.

También debe administrar el archivo PID (si usa uno), asegúrese de que su copia todavía se esté ejecutando antes de pausarlo, probablemente querrá limpiarlo eliminando el archivo pid una vez que la copia haya terminado, etc.

En otras palabras, necesita más información sobre esto para hacer una confiable, pero la idea básica de usar estas señales SIGSTOP y SIGCONT para pausar / reanudar la ejecución de un proceso parece ser lo que está buscando.



1
Tal vez agregue un recordatorio de que debe tener mucho cuidado de que '/var/run/bigcopy.pid' todavía se refiera al mismo proceso que usted cree. La detención aleatoria de otros procesos en el sistema puede no ser deseable. Sin embargo, no conozco una forma segura de garantizar que el pid se refiera al programa que crees que hace ...
Evan Benn

@EvanBenn Sí, eso es lo que quise decir de alguna manera con "asegúrese de que su copia aún se esté ejecutando antes de pausarla", ¡aunque su punto es seguramente más explícito que eso! Sí, verificar los PID es inherentemente de carrera, por lo que a veces no es realmente posible hacerlo de manera 100% confiable ...
Filbranden

@cat No realmente, un proceso no puede bloquear SIGSTOP. Vea el enlace del primer comentario: "SIGSTOP es una señal no bloqueable como SIGKILL" (o simplemente búscalo en Google, verás que ese es el caso.)
filbranden

76

En lugar de suspender el proceso, también podría darle menor prioridad:

renice 19 "$pid"

le dará la prioridad más baja (la mayor amabilidad), por lo que ese proceso cederá la CPU a otros procesos que la necesitan la mayor parte del tiempo.

En Linux, lo mismo se puede hacer con E / S con ionice:

ionice -c idle -p "$pid"

Pondrá el proceso en la clase "inactiva", de modo que solo obtendrá tiempo de disco cuando ningún otro programa haya solicitado E / S de disco durante un período de gracia definido .


22
Este es un caso típico de un problema XY . La pregunta era cómo pausar un proceso, pero esto no responde la pregunta. Si bien reducir la prioridad es el mejor enfoque para el problema real , no responde la pregunta. Me gustaría editar la pregunta para incluir también la forma de hacer una pausa en un proceso y por qué hacer una pausa puede ser un problema (por ejemplo, archivos podría ser editado durante la pausa).
MechMK1

22
@DavidStockinger, técnicamente, esta respuesta le dice cómo decirle al sistema operativo que pause el proceso cuando está ocupado (el sistema operativo, la CPU, el programador de E / S) (incluso si es por fracciones de segundos a la vez). Cómo suspender el proceso manualmente ya se ha cubierto en otras respuestas. Esta solución no soluciona el problema de los archivos que se modifican mientras se copian.
Stéphane Chazelas

55
Cambiar la prioridad de E / S no siempre es la mejor solución. Si está copiando desde discos giratorios, aún puede incurrir en una búsqueda antes de cada solicitud de alta prioridad en la que no incurriría si detuviera por completo la operación de baja prioridad.
Mark

2
Una prioridad más baja ni siquiera resuelve el problema. Incluso si la caja está completamente inactiva durante unos segundos o minutos, eso no significa que un gran proceso de copia que desalojará todo del caché del sistema de archivos no será molesto. Tan pronto como haya una carga nuevamente, va a ser muy lento paginar todo de nuevo.
R ..

2
@DavidStockinger, la forma preferida de tratar los problemas XY es dar la solución correcta , incluso si esa no es la pregunta. Cuando sabe que el enfoque descrito en la pregunta es incorrecto, entonces una buena respuesta no da ese enfoque incorrecto, sino que propone una mejor.
terdon

8

Use rsync, olvídese de cp, para este escenario. hay parámetros para limitar el ancho de banda, o se pueden matar / detener y comenzar más tarde, de una manera que continuará, donde dejó el / los ejemplo / s de google rsync


3

Si vas a hacerlo interrumpiendo el proceso de ejecución, te sugiero que juegues con el programa Screen. No he usado Linux en mucho tiempo, pero IIRC solo pausando el comando y reanudándolo más tarde lo deja bastante vulnerable, si accidentalmente se desconecta, no podrá reanudar su sesión.

Con la pantalla, creo que puede interrumpir la sesión, luego desconectarla y cerrar sesión. Más tarde puede volver y volver a adjuntar a esa sesión. Tendría que jugar un poco con él, pero hizo que las sesiones fueran mucho más robustas.

También puede cerrar sesión e irse a casa, luego iniciar sesión de forma remota, volver a conectarlo al sistema que inició en la oficina y reanudarlo por la noche, luego retomarlo al día siguiente en el trabajo.


Ya estoy usando tmux para tha. Pero estoy escribiendo un script que sería consciente de sí mismo o, preferiblemente, consciente del medio ambiente, por lo que se detiene si el servidor recibe un tráfico elevado y continúa cuando es normal.
Sollosa

0

Si su shell lo admite (casi todos lo hacen), puede presionar ^ Z (Ctrl + Z) para enviar fácilmente una SIGTSTPseñal a la tarea en primer plano, luego continuar con fg(en primer plano) o bg(en segundo plano).

Si hace esto en varias tareas y desea volver a ellas más tarde, puede usar el jobscomando y luego regresar con fg/bg %#, donde # es el número entre paréntesis en los trabajos.

Tenga en cuenta que SIGTSTPes un poco diferente a SIGSTOP(que se usa en todas las demás respuestas), lo más importante debido al hecho de que puede ignorarse (pero no vi que un programa lo ignore de otra manera sl). Se pueden encontrar más detalles en esta respuesta en StackOverflow .


Sorprendido de que ninguna respuesta mencione esto todavía.
Ave

Ty Ave, conozco este truco multitarea. Pero para que eso suceda, uno necesita estar en la terminal, mientras que yo debía crear un script que hiciera el trabajo por sí solo, sin importar si toma días.
Sollosa

@Sollosa puede ser útil para otros con la misma pregunta y con acceso a un terminal.
Ave

Estoy de acuerdo. Un
placer
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.