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.
process
process-management
Sollosa
fuente
fuente
cp -al
para hacer una granja de enlaces rígidos? ¿O usar un sistema de archivos que admita enlaces de nivel de bloque con copia en escritura, usandocp -a --reflink=auto
? BTRFS y ZFS admiten eso para copias dentro del mismo dispositivo físico.src
cambia entre las 9:00 y las 14:00? Si es así, simplemente pausar y reanudar elcp
proceso puede resultar en archivos corruptos. Puede ser mejor ejecutarrsync
en combinación con eltimeout
comando.Respuestas:
Sí, usted necesita
El proceso se mostrará con el estado "T" (PS). Para continuar hacer un
¡Buena suerte!
fuente
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:
Luego, cuando comienza el tiempo ocupado, envíele un SIGSTOP:
Más tarde, cuando el servidor esté inactivo nuevamente, reanúdelo.
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.
fuente
En lugar de suspender el proceso, también podría darle menor prioridad:
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
: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 .
fuente
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
fuente
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.
fuente
Si su shell lo admite (casi todos lo hacen), puede presionar ^ Z (Ctrl + Z) para enviar fácilmente una
SIGTSTP
señal a la tarea en primer plano, luego continuar confg
(en primer plano) obg
(en segundo plano).Si hace esto en varias tareas y desea volver a ellas más tarde, puede usar el
jobs
comando y luego regresar confg/bg %#
, donde # es el número entre paréntesis en los trabajos.Tenga en cuenta que
SIGTSTP
es un poco diferente aSIGSTOP
(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 manerasl
). Se pueden encontrar más detalles en esta respuesta en StackOverflow .fuente