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 now
aprè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?
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.
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.
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
Je fais ça tout le temps.
&&
.fg && shutdown -h now
pour: 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
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.