comment exécuter la commande après la commande en cours d'exécution dans bash?

19

Je télécharge un fichier avec wget et je veux éteindre mon ordinateur une fois le téléchargement terminé, mais je dois aller quelque part maintenant :) Est-il possible d'exécuter la commande dans bash exactement lorsque le processus sera terminé?

Je sais que cela fonctionne:

wget http://example.com/file.rar; arrêter maintenant

Mais si je tape seulement:

wget http://example.com/file.rar
inothemo
la source
2
Pensez à utiliser && et || au lieu de ;. && et || vérifiez la valeur de retour de la commande précédente avant d'exécuter la commande suivante ... juste au cas où wget échouerait, vous pourriez ne pas vouloir arrêter.
KFro

Réponses:

31

Vous pouvez faire quelque chose comme ça:

  1. arrêter l'exécution de wget avec ctrl-z (il n'est pas arrêté, il est suspendu)
  2. mettre en arrière-plan (bg)
  3. courir: attendre; arrêt -h maintenant

wait attendra tous les programmes exécutés en arrière-plan à partir du shell actuel - c'est-à-dire ce wget.

Une fois l'attente terminée, l'arrêt se poursuit.


la source
n'oubliez pas de mettre en avant (fg) votre instance wget une fois terminé. Si wget est déjà en cours d'exécution, vous pouvez le mettre au premier plan avec ^ z (control-z).
Andrew Scagnelli le
4
Pas besoin, sauf si vous voulez vraiment voir la barre de progression.
dmckee
Pas besoin car il laisse la machine à elle-même puis s'arrête.
Wolf
11

Dans un autre shell, utilisez

ps -u <your username> | grep wget

pour trouver le PID de la commande que vous souhaitez attendre, puis

wait <PID>; shutdown -h now

afin que l'arrêt ne s'exécute pas tant que le processus n'est pas terminé. Voir aussi la réponse de depesz .

dmckee
la source
+1, juste une note: waitne fonctionnera que pour les commandes démarrées à partir du même shell
Chriki
5

Mes solutions sont les suivantes: suspendez votre tâche de longue durée avec Control + Z, puis tapez quelque chose comme:

fg; echo "Done!"

Si vous souhaitez exécuter réagir différemment en fonction du succès ou de l'échec de votre commande, utilisez && et || en tant qu'opérateurs de court-circuit.

fg && echo "Success!" || echo "Failure!"

EDIT: Cela ne fonctionnera pas avec sudo, car il vous demandera votre mot de passe. J'ai donc supprimé les exemples en utilisant sudo. Si vous avez besoin de sudo pour la deuxième tâche, utilisez une autre des méthodes publiées ici.

D'un autre côté, je pense que GNOME et KDE offrent tous deux des moyens de déclencher un arrêt / redémarrage sans utiliser sudo, en envoyant un signal D-Bus approprié ou quelque chose du genre.

Ryan C. Thompson
la source
+1 pour fg..., mais sudopourrait être un problème s'il vous demande un mot de passe
mark4o
Hmm. Oui, je n'ai pas utilisé cette astuce pour faire des sudos quand quelque chose se termine. Pour sudo, vous auriez besoin d'une astuce différente. Je modifierai mon message en conséquence.
Ryan C. Thompson, le
Dans mon but, cette réponse est supérieure car elle remet automatiquement le processus au premier plan
Cookie
De plus, les mots de passe pour sudo peuvent être désactivés (par utilisateur et par commande) - si l'utilisateur est autorisé à s'arrêter via sudo cette fois, il pourrait être autorisé à le faire toujours. Un arrêt hostile peut ne pas être aussi dangereux dans certains cas - certainement pas aussi dangereux qu'un accès invité compromis sur une machine en cours d'exécution.
Cookie
1

Oui, tapez simplement votre deuxième commande et appuyez sur Entrée. Si votre programme actuel fait défiler du texte, vous ne pouvez pas voir ce que vous tapez correctement, alors surveillez vos touches afin de bien le faire.

Une manière plus intelligente consiste à passer à un autre TTY (CTRL + ALT + F1 à F6) et à exécuter la commande simultanément, ou si vous utilisez un programme en ligne de commande comme l'écran, vous pouvez créer une nouvelle fenêtre.

Tamara Wijsman
la source
+1 pour la première option. J'ai peur de ne pas comprendre comment la deuxième option est censée fonctionner.
innaM
Par exemple, en appuyant sur CTRL + ALT + F2, vous basculerez vers une nouvelle deuxième console où vous pourrez vous connecter et taper une commande, de cette façon vous pourrez y exécuter une deuxième commande. Deuxièmement, si vous téléchargez l'écran (un programme pour utiliser votre console de manière plus sophistiquée), vous pouvez ouvrir un deuxième onglet / fenêtre où vous pouvez à nouveau taper des commandes, sans avoir à vous reconnecter. Mais comme vous en avez besoin simultanément, vous pouvez rester avec l'option 1, je ne pense pas qu'il existe une autre façon d'obtenir le même effet. Sauf si vous utilisez un autre TTY / fenêtre pour vérifier dans un script si le processus est toujours en cours d'exécution. :-P
Tamara Wijsman
Utilisez le PID d'attente de la réponse de dmckee
Cookie
1

Si vous voulez vous faire plaisir, vérifiez l'état de retour du wget et arrêtez-le uniquement s'il a réussi.

% wget http://example.com/file.rar
% if [ $? -eq 0 ]
> then
> shutdown now
> fi
Doug Harris
la source
2
C'est une bonne approche lors de l'écriture de scripts, mais pendant les wgetexécutions, vous ne recevez pas d'invite pour créer le test.
dmckee
Vous pouvez combiner cela avec mon astuce Control-Z et fg pour contourner cela.
Ryan C. Thompson, le