Comment puis-je ajouter à un processus déjà en cours d'exécution une commande d'arrêt supplémentaire?

11

Sur une base régulière, j'oublie d'ajouter && shutdown -h nowà un processus de longue haleine. Existe-t-il un moyen d'ajouter une shutdown -h nowcommande après l'appel de la première commande? Il ne vise pas à interrompre le processus en cours. Peut-être qu'il est possible de regarder le PID?

brubaker
la source
J'espère que vous vous rendez compte que tout ce qui vient après &&ne fonctionnera que si la commande précédente a réussi. Si vous souhaitez qu'il s'exécute même si la commande échoue, utilisez ;plutôt.
Zoke

Réponses:

13

Il n'est pas nécessaire d'exécuter à plusieurs reprises ps pour répertorier tous les processus et grep à travers la sortie. Mettez le processus en arrière-plan avec ctrl-Z, puis exécutez

bg %1 ; wait %1 ; shutdown -h now

Si d'autres tâches d'arrière-plan sont en cours d'exécution, vous recevrez une spécification de tâche différente au lieu de [1] lorsque vous ctrl-z. Si oui, utilisez-le à la place.

psusi
la source
3

Vous pouvez faire quelque chose comme ceci, qui vérifiera si le processus s'exécute toutes les 5 secondes et prendra les mesures appropriées:

while true; do
  if ps -ef | grep -q '[l]ong-running-process'; then
    sleep 5
  else
    sudo poweroff
  fi
done

Notez les crochets dans l' grepexpression. C'est pour s'assurer que le grepprocessus ne soit pas mis en correspondance s'il finit dans la psliste. Entourer n'importe quel caractère avec des crochets suffit.

Scott Severance
la source
+1 car cela fonctionne. Pas comme je l'aurais fait.
Zoke
@Zoke: S'il y a un autre moyen, je serais intéressé.
Scott Severance
A également publié une réponse. Vérifiez-le si vous le souhaitez.
Zoke
Vous pouvez également utiliser kill -0 (pid) pour vérifier l'existence d'un processus sans le tuer.
moelleux
3

Je le fais tout le temps.

  1. Démarrez le processus.
  2. Sachez que j'ai oublié de faire ma &&commande.
  3. Appuyez sur Ctrl+ Zpour suspendre le processus et revenir au shell.
  4. Courez fg && shutdown -h nowvers:
    1. Mettez en avant et reprenez le processus que vous venez de suspendre.
    2. Ensuite, une fois terminé, il exécutera ce que vous vouliez exécuter.

Alternativement, vous pouvez interroger comme suggéré dans d'autres réponses comme celle-ci:

while ps -p $PID ; do sleep 5 ; done ; shutdown -h now
Naftuli Kay
la source
Cela s'arrêtera immédiatement.
psusi
Le fg se termine tout de suite, alors ...
psusi
@psusi non ça ne marchera pas
Walking Wiki
@WalkingWiki, oh bizarre, tu as raison. Je jure que j'ai testé cela en 2012 et qu'il s'est terminé immédiatement.
psusi
1

Si vous connaissez le pid, vous pouvez exécuter ceci:

while ps -p $PID; sleep 5; done; shutdown -h now

Pour exécuter sans écho de ps, procédez comme suit:

while ps -p $PID >/dev/null; sleep 5; done; shutdown -h now

Et enfin pour l'exécuter en arrière-plan sans aucune sortie:

(while ps -p $PID >/dev/null; sleep 5; done; shutdown -h now ) &

La solution de Scott est une bonne solution, mais cela élimine le besoin de greprépéter si vous connaissez déjà le pid. Et c'est beaucoup plus rapide à taper.: P

Zoke
la source
0

Créez un script shell pour exécuter les deux processus:

MyShellScript.txt:

#!/bin/sh
MyProcessIdLikeToStart -o options && shutdown -h now

Après avoir enregistré cela dans le répertoire où vous démarrez le processus donné, procédez comme suit:

chmod +x MyShellScript.txt

Ensuite, lorsque vous souhaitez exécuter la commande, tapez simplement ./MyShellScript.txtet elle fera les deux pour vous.

Chris Curry
la source