web-dev-qa-db-fra.com

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

J'oublie régulièrement d'ajouter && shutdown -h now à un processus de longue durée. Est-il possible d'ajouter une commande shutdown -h nowaprès la première commande a été appelée? Il n'est pas prévu d'interrompre le processus en cours. Peut-être est-il possible de regarder le PID?

10
brubaker

Il n'est pas nécessaire d'exécuter plusieurs fois ps pour répertorier tous les processus et grep dans la sortie. Arrière-plan du processus avec ctrl-Z, puis exécutez

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

Si vous avez d'autres tâches en arrière-plan en cours d'exécution, vous obtiendrez une tâche spécifique différente de la tâche au lieu de [1] lorsque vous appuyez sur ctrl-z. Si c'est le cas, utilisez-le à la place.

11
psusi

Vous pouvez faire quelque chose comme ceci, qui vérifiera si le processus est en cours d'exécution 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'expression grep. Cela permet de s'assurer que le processus grep ne soit pas mis en correspondance s'il se trouve dans la liste ps. Entourer un seul caractère entre crochets suffit.

3
Scott Severance

Si vous connaissez le pid, vous pouvez lancer ceci:

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

Pour exécuter sans echo 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 bonne, mais cela supprime le besoin de grep encore et encore si vous connaissez déjà le pid. Et c'est beaucoup plus rapide de taper.: P

1
Zoke

Je fais ça tout le temps.

  1. Lancer le processus.
  2. Réalisez que j'ai oublié de faire ma commande &&.
  3. Frappé Ctrl+Z pour suspendre le processus et retourner dans le shell.
  4. Exécutez fg && shutdown -h now pour:
    1. Mettez au premier plan et reprenez le processus que vous venez de suspendre.
    2. Puis, 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
1
Naftuli Kay

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

MyShellScript.txt:

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

Après avoir sauvegardé ceci dans le répertoire où vous démarrez le processus donné, faites un:

chmod +x MyShellScript.txt

Ensuite, lorsque vous voulez exécuter la commande, tapez simplement ./MyShellScript.txt et les deux seront à votre place.

0
Chris Curry