Comment puis-je mettre le processus Linux en cours d'exécution en arrière-plan? [fermé]

111

J'ai une commande qui télécharge des fichiers à l'aide de git sur un serveur distant à partir du shell Linux et cela prendra de nombreuses heures.

Comment puis-je mettre ce programme en cours d'exécution en arrière-plan? Pour que je puisse toujours travailler sur le shell et que ce processus soit également terminé?

Mirage
la source
Juste une supposition, mais avez-vous essayé ctrl + z ou exécuter votre commande comme ceci; #command &
EralpB
La commande est déjà en cours d'exécution donc je n'ai pas d'autre option. Je ne sais pas quelle commande essayer. Je ne voulais pas interrompre le processus actuel, donc je ne l'ai pas expérimenté
Mirage
Nous devrions alors attendre une réponse plus professionnelle :) Je voulais dire si vous aviez la chance de tout recommencer. (La commande & chose)
EralpB
Le répondant accepté sur cette question explique les trois étapes à suivre: stackoverflow.com/questions/625409/…
Leonard Saers
Vous pouvez également simplement ouvrir une deuxième instance de putty et vous reconnecter au serveur pour obtenir une autre coque. Bien que la solution avec ctrl+zsoit excellente.
Ela782 le

Réponses:

207

Suspendez le processus avec CTRL + Z puis utilisez la commande bgpour le reprendre en arrière-plan. Par exemple:

sleep 60
^Z  #Suspend character shown after hitting CTRL+Z
[1]+  Stopped  sleep 60  #Message showing stopped process info
bg  #Resume current job (last job stopped)

En savoir plus sur le contrôle des tâches et l' bgutilisation dans bashla page de manuel:

JOB CONTROL
Taper la suspension caractère de (généralement ^ Z, Control-Z) alors qu'un processus est en cours d'exécution provoque l'arrêt de ce processus et renvoie le contrôle à bash. [...] L'utilisateur peut alors manipuler l'état de ce travail, en utilisant la commande bg pour le poursuivre en arrière-plan, [...]. A ^ Z prend effet immédiatement et a pour effet secondaire supplémentaire de rejeter la sortie en attente et la tête de frappe.

bg [ jobspec ...]
Reprenez chaque job jobpec suspendu en arrière-plan, comme s'il avait été démarré avec &. Si jobspec n'est pas présent, la notion du shell du travail en cours est utilisée.

ÉDITER

Pour démarrer un processus où vous pouvez même tuer le terminal et il continue à fonctionner

nohup [command] [-args] > [filename] 2>&1 &

par exemple

nohup /home/edheal/myprog -arg1 -arg2 > /home/edheal/output.txt 2>&1 &

Pour ignorer simplement la sortie (pas très judicieux), changez le nom du fichier en /dev/null

Pour que le message d'erreur soit défini sur un fichier différent, remplacez le &1par un nom de fichier.

De plus: vous pouvez utiliser la jobscommande pour afficher une liste indexée de ces processus en arrière-plan. Et vous pouvez tuer un processus en arrière-plan en exécutant kill %1ou kill %2avec le numéro étant l'index du processus.

Ed Heal
la source
Je l'ai essayé mais comme il produit quelque chose, il revient à nouveau au premier plan avec% indiquant la quantité de données téléchargées
Mirage
Le processus écrira toute sortie sur le terminal lorsque vous lui avez demandé de le faire au début. Vous devrez le redémarrer pour obtenir la sortie à écrire dans un fichier ou /dev/null. Voir la modification ci-dessus.
Ed Heal
donc cela signifie que si le processus est déjà lancé, il n'y a aucun moyen de rediriger la sortie
Mirage
Oui en effet. Vous ne pouvez pas affecter le processus uniquement au shell à partir duquel il s'exécute. Vous pouvez faire un kill -9 <pid of your shell, puis le processus fonctionnera toujours et la sortie sera supprimée - mais vous devrez vous reconnecter pour démarrer un nouveau shell.
Ed Heal
Vous pouvez également utiliser la disowncommande si vous devez vous déconnecter de votre session de terminal et que vous souhaitez qu'elle continue de fonctionner.
kirk roerig