Comment savoir quelle commande est exécutée sans l'arrêter?

20

Dans mon exemple, j'exécute une commande qui prend très longtemps à être exécutée (plusieurs heures).

Je ne me souviens pas vraiment si j'ai entré make ou make -j4.

Bien sûr, je pourrais l'arrêter et appuyer sur la touche ou consulter l'historique pour le savoir, mais cela arrêterait le processus et je ne veux pas que cela se produise (au cas où il ferait déjà make -j4).

Existe-t-il un moyen de savoir quelle commande est exécutée sans arrêter le processus?

Daniel Viaño
la source
5
Depuis un autre terminal, essayezpgrep -a make
John1024
2
Dans le cas de makevous pouvez l'arrêter et le redémarrer et il devrait reprendre là où il s'était arrêté.
user253751

Réponses:

34

Si vous voulez voir la ligne de commande complète pour chaque instance makequi s'exécute sur votre ordinateur, ouvrez un nouveau terminal et essayez:

pgrep -a make

pgrepest un programme qui recherche dans tous les processus de votre ordinateur. Dans ce cas, il recherche des programmes nommés make. L'option -aindique pgrepde répertorier à la fois l'ID de processus et la ligne de commande complète pour chaque processus correspondant. (Sans -a, cela retournerait simplement l'ID du processus.) Pour plus d'informations sur les nombreuses options de pgrep, voir man pgrep.

John1024
la source
7
Ceci est utile pour des cas simples comme celui de la question. Cependant, si la commande impliquait des pipelines, des boucles, des séquences de commandes, des commandes internes ou une expansion variable, ce que vous trouveriez avec pgrepserait différent de la commande qui a été tapée sur la ligne de commande.
kasperd
28

Pendant que la fenêtre du terminal est active, vous pouvez suspendre (suspendre) le processus en appuyant sur Ctrl+ Z. Vous pouvez ensuite pousser le travail en arrière-plan en tapant bg(votre travail va maintenant continuer en arrière-plan et vous pouvez en même temps travailler sur la ligne de commande; cela revient à démarrer un travail avec &à la fin de la ligne de commande). Utilisez ensuite les flèches du curseur (haut et bas) pour voir quelle commande vous avez utilisée. Si vous le souhaitez (mais ce n'est pas nécessaire), vous pouvez ensuite mettre votre travail au premier plan en tapant fg.

Stefan
la source
7
Cela fonctionne avec certaines commandes mais pas toutes. Par exemple, si vous avez tapé une boucle comme celle-ci, for X in {1..1000} ; do sleep $X ; donela boucle serait interrompue et les itérations restantes ne se produiraient pas.
kasperd
11
@kasperd Oui, assez ennuyeux si vous me le demandez, mais j'ai découvert une solution de contournement intéressante pour ce problème. Entourez une commande compliquée comme celle-ci entre parenthèses, c'est donc un sous-shell. Ensuite, Ctrl-Z suspendra l'ensemble du sous-shell et reprendra correctement.
penguin359
@kasperd Pas en bash, mais ils le font en zsh.
JoL
4
Pas besoin de mettre le travail en arrière-plan: il suffit de le suspendre, de vérifier l'historique (ou jobs, comme le montre la réponse de @ ichabod), puis de le reprendre via fg.
Konrad Rudolph
10

Je fais quelque chose comme Stefan: ^ Z pour suspendre le travail, puis je cours jobs. Si plusieurs processus sont en cours d'exécution, vous devrez peut-être trier le travail qui a été interrompu, mais cela donnera généralement la ligne de commande. Exécutez ensuite fgpour continuer l'exécution.

ichabod
la source
1

Une bonne façon de voir cela dynamiquement est de lancer top, et cela vous indique l'état général du système et les processus en cours d'exécution sur le système.

Faire un `` ps ux '' montre vos processus avec pid et d'autres informations, vous pouvez utiliser des compétences pour en supprimer certains si vous le souhaitez, la page de manuel pour cela est une bonne ressource, et faire une compétence ou tuer -9 devient des processus collants bloqué dans l'appareil attend etc. Vous pouvez également envoyer d'autres signaux à des processus tels que -hup, redémarrer les démons, etc.

Le haut est agréable car il vous montre la taille du processus, le temps écoulé et les états actuels du processeur et celui de la mémoire et du swap.

Je fais souvent un $ make> & make.out & puis moins ou tail -f sur le fichier journal make.out. Depuis, make est détaché en tant que processus de ma session shell.


la source