web-dev-qa-db-fra.com

Existe-t-il un moyen de suspendre un processus en cours sur les systèmes Linux et de reprendre plus tard?

Je dois copier des fichiers sur une machine. Et les données sont immensément volumineuses. Désormais, les serveurs doivent fonctionner normalement, et il y a généralement une plage particulière d'heures chargées sur ceux-ci. Existe-t-il donc un moyen d'exécuter de telles commandes de telle sorte que si le serveur atteint des heures de pointe, il interrompt le processus et lorsqu'il sort de cette plage, il le reprend?

Résultat prévu

cp src dst

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

Oui, vous devez acquérir l'ID de processus du processus à suspendre (via la commande ps), puis procédez comme suit:

$> kill -SIGSTOP <pid>

Le processus apparaîtra alors avec le statut "T" (dans ps).

Pour continuer, faites:

$> kill -CONT <pid>
10
gerhard d.

Vous pouvez suspendre l'exécution d'un processus en lui envoyant un signal SIGSTOP puis le reprendre plus tard en lui envoyant un SIGCONT.

En supposant que votre charge de travail est un processus unique (ne charge pas les assistants en arrière-plan), vous pouvez utiliser quelque chose comme ceci:

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

Ensuite, lorsque le temps occupé commence, envoyez-lui un SIGSTOP:

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

Plus tard, lorsque le serveur est à nouveau inactif, reprenez-le.

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

Vous devrez planifier cela à des heures spécifiques lorsque vous le souhaitez, vous pouvez utiliser des outils tels que les temporisateurs cron ou systemd (ou une variété d'autres outils similaires) pour obtenir ce calendrier. Au lieu de planifier en fonction d'un intervalle de temps, vous pouvez choisir de surveiller le serveur (en examinant peut-être la moyenne de charge, l'utilisation ou l'activité du processeur à partir des journaux du serveur) pour décider quand 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 l'interrompre, vous voudrez probablement nettoyer en supprimant le fichier pid une fois la copie terminée, etc.

En d'autres termes, vous en avez besoin de plus pour rendre fiable, mais l'idée de base d'utiliser ces signaux SIGSTOP et SIGCONT pour suspendre/reprendre l'exécution d'un processus semble être ce que vous recherchez.

77
filbranden

Au lieu de suspendre le processus, vous pouvez également lui accorder une priorité inférieure:

renice 19 "$pid"

lui donnera la priorité la plus basse (la plus haute gentillesse), de sorte que le processus cédera le CPU aux autres processus qui en ont besoin la plupart du temps.

Sous Linux, la même chose peut être faite avec les E/S avec ionice:

ionice -c idle -p "$pid"

Placera le processus dans la classe "inactive", de sorte qu'il n'obtiendra le temps disque que si aucun autre programme n'a demandé d'E/S disque pour une période de grâce définie.

76
Stéphane Chazelas

Utilisez rsync, oubliez cp, pour ce scénario. il existe 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 continuera, là où il a laissé google rsync example/s

8
Anton Tománek

Si vous allez 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 l'IIRC suspendant simplement la commande et la reprenant plus tard vous rend assez vulnérable, si vous vous déconnectez accidentellement, vous ne pourrez pas reprendre votre session.

Avec screen, je pense que vous pouvez interrompre la session puis la détacher et vous déconnecter. Plus tard, vous pouvez revenir en arrière et vous rattacher à cette session. Il faudrait jouer un peu avec, mais cela rendait les sessions beaucoup plus robustes.

Vous pouvez également vous déconnecter et rentrer chez vous, puis vous connecter à distance, reconnecter au système que vous avez commencé au bureau et le reprendre pour la soirée, puis le reprendre le lendemain au travail.

3
Bill K

Si votre shell le prend en charge (presque tous le font), vous pouvez appuyer sur ^ Z (Ctrl + Z) pour envoyer facilement un signal SIGTSTP à la tâche de premier plan, puis continuer avec fg (au premier plan ) ou bg (en arrière-plan).

Si vous effectuez cette opération sur plusieurs tâches et que vous souhaitez y revenir ultérieurement, vous pouvez utiliser la commande jobs, puis revenir avec fg/bg %#, où # est le nombre indiqué entre parenthèses sur les travaux.

Gardez à l'esprit que SIGTSTP est un peu différent de SIGSTOP (qui est utilisé sur toutes les autres réponses), surtout parce qu'il peut être ignoré (mais je n'ai pas vu de programme l'ignore autre que sl). Plus de détails peuvent être trouvés sur cette réponse sur StackOverflow .

0
Ave