Je dois copier des fichiers sur une machine. Et les données sont immenses. Maintenant, les serveurs doivent servir normalement, et il y a généralement une plage d'heures occupées. Existe-t-il donc un moyen d'exécuter de telles commandes de manière à interrompre le processus si le serveur est surchargé, puis à le reprendre lorsqu'il est en dehors de cette plage?
Résultat prévu
cp src dst
if time between 9:00-14:00 pause process
After 14:00 resume cp command.
process
process-management
Sollosa
la source
la source
cp -al
pour créer une ferme hardlink? Ou utilisez un système de fichiers qui prend en charge les liaisons de connexion au niveau des blocs avec la copie sur écriture, en utilisantcp -a --reflink=auto
? BTRFS et ZFS prennent cela en charge pour les copies dans le même périphérique physique.src
changent entre 9h00 et 14h00? Si tel est le cas, une simple pause et une reprise ducp
processus peuvent endommager les fichiers. Il peut être préférable d’exécuterrsync
en combinaison avec latimeout
commande.Réponses:
Oui, vous devez
Le processus sera alors affiché avec le statut "T" (PS). Pour continuer faire un
Bonne chance!
la source
Vous pouvez suspendre l'exécution d'un processus en lui envoyant un signal SIGSTOP, puis le reprendre ultérieurement en lui envoyant un SIGCONT.
En supposant que votre charge de travail est un processus unique (vous ne devez pas créer de fichiers d'aide en arrière-plan), vous pouvez utiliser quelque chose comme ceci:
Puis, lorsque le temps occupé commence, envoyez-lui un SIGSTOP:
Plus tard, lorsque le serveur est à nouveau inactif, reprenez-le.
Vous aurez besoin de planifier cela pour des heures spécifiques quand vous voulez qu'il soit exécuté. Vous pouvez utiliser des outils tels que les timers cron ou systemd (ou une variété d'autres outils similaires) pour le planifier. Au lieu de planifier en fonction d'un intervalle de temps, vous pouvez choisir de surveiller le serveur (en examinant éventuellement la charge moyenne, l'utilisation du processeur ou l'activité des journaux du serveur) pour décider du moment opportun pour suspendre / reprendre la copie.
Vous devez également gérer le fichier PID (si vous en utilisez un), assurez-vous que votre copie est toujours en cours d'exécution avant de le suspendre, vous voudrez probablement nettoyer en supprimant le pidfile une fois la copie terminée, etc.
En d’autres termes, vous avez besoin de plus d’informations autour de cela pour rendre le processus fiable, mais l’idée de base consistant à utiliser ces signaux SIGSTOP et SIGCONT pour suspendre / reprendre l’exécution d’un processus semble être ce que vous recherchez.
la source
Au lieu de suspendre le processus, vous pouvez également lui donner une priorité plus basse:
lui donnera la priorité la plus basse (la plus grande gentillesse), de sorte que ce processus cédera le processeur aux autres processus qui en ont le plus souvent besoin.
Sous Linux, on peut faire la même chose avec les E / S avec
ionice
:Le processus sera placé dans la classe "inactif", de sorte qu'il obtiendra l'heure du disque uniquement si aucun autre programme n'a demandé d'entrées / sorties disque pour une période de grâce définie .
la source
Utilisez rsync, oubliez cp, pour ce scénario. il y a des paramètres pour limiter la bande passante, ou peuvent être tués / arrêtés et démarrés plus tard, d'une manière qui va continuer, où il a laissé google rsync example / s
la source
Si vous voulez le faire en interrompant le processus en cours, je vous suggère de jouer avec le programme Screen. Je n'ai pas utilisé Linux depuis un moment, mais le IIRC met juste en pause la commande et la reprend plus tard, ce qui vous laisse plutôt vulnérable. Si vous vous déconnectez accidentellement, vous ne pourrez pas reprendre votre session.
Avec l’écran, je crois que vous pouvez interrompre la session puis la détacher et vous déconnecter. Plus tard, vous pourrez revenir et vous rattacher à cette session. Il faudrait jouer un peu avec cela, mais cela rendait les sessions beaucoup plus robustes.
Vous pouvez également vous déconnecter et rentrer à la maison, puis vous connecter à distance, vous reconnecter au système que vous avez commencé au bureau et le reprendre pour la soirée, puis le reprendre le lendemain au travail.
la source
Si votre shell le supporte (presque tous le font), vous pouvez appuyer sur ^ Z (Ctrl + Z) pour envoyer facilement un
SIGTSTP
signal à la tâche de premier plan, puis le poursuivre avecfg
(au premier plan) oubg
(sur le fond).Si vous effectuez cette opération sur plusieurs tâches et souhaitez y revenir ultérieurement, vous pouvez utiliser
jobs
commande, puis renvoyer avecfg/bg %#
, où # est le nombre indiqué entre parenthèses pour les travaux.Gardez à l'esprit que
SIGTSTP
c'est un peu différent deSIGSTOP
(qui est utilisé dans toutes les autres réponses), principalement parce qu'il peut être ignoré (mais je n'ai pas vu un programme l'ignorer autrement quesl
). Plus de détails peuvent être trouvés sur cette réponse sur StackOverflow .la source