J'ai un programme en cours d'exécution sur un ordinateur distant qui ne doit pas être arrêté. J'ai besoin de suivre quand ce programme est arrêté et d'exécuter immédiatement une commande. Le PID est connu. Comment puis-je faire cela?
3 Réponses :
Un code comme celui-ci peut faire le travail (à exécuter sur un ordinateur distant)
while true do if [ "$(ps -p $PIDN|wc -l)" -lt 2 ] then <exec code>; break fi sleep 5 done
Il s'attend à ce que la variable PIDN contienne le PID.
P.S. Je sais que le code est moche et gourmand en énergie
EDIT: il est possible d'utiliser -p dans ps pour éviter un grep
XXX
Maintenant, vous savez à quel point il serait portable, mais au moins sur la version BSD de ps il y a une option -p pour n'afficher qu'un processus spécifique
@ChatterOne, sous Linux ps , vous avez également l'option -p (ou p ) pour sélectionner un pid. Mais sur certains UNIX, vous ne le trouverez peut-être pas. Mais va l'ajouter, merci pour l'idée
Vous ne pouvez pas attendre code > pour les processus non enfants .
Le moyen le plus efficace dans un shell serait probablement d'interroger en utilisant le code de sortie de kill -0 pour vérifier si le processus existe:
while kill -0 $PID 2>/dev/null; do sleep 1; done
C'est à la fois plus simple et plus efficace que toute approche impliquant ps et grep . Cependant, cela ne fonctionne que si votre utilisateur est autorisé à envoyer des signaux à ce processus.
Je suis d'accord que kill -0 est un bon moyen de vérifier un processus en cours, avec une mise en garde - il ne réussit que si l'utilisateur actuel a la permission d'envoyer des signaux à ce processus.
Voici un moyen assez simple d'attendre la fin d'un processus en utilisant la stratégie ps -p PID :
if ps -p "$PID" >/dev/null 2>&1; then
echo "Process $PID exists!"
if kill -0 "$PID" >/dev/null 2>&1; then
echo "You can send signals to process $PID, e.g. with 'kill $PID'"
else
echo "You do not have permission to send signals to process $PID"
fi
else
echo "Process $PID does not exist."
fi
En général, pour vérifier la propriété du processus ou l'autorisation de tuer (envoyer des signaux à) un processus, vous pouvez utiliser une combinaison de ps -p PID et kill -0 code>:
if ps -p "$PID" >/dev/null 2>&1; then
echo "Process $PID is running ..."
while ps -p "$PID" >/dev/null 2>&1; do
sleep 5
done
echo "Process $PID is not running anymore."
fi
Contrôlez-vous la façon dont le programme démarre? Voulez-vous l'exécution sur un programme déjà exécuté ou sur la prochaine exécution?
@RomeoNinov Ce programme est déjà en cours d'exécution, je dois attendre qu'il s'arrête.
Quelque chose comme ça peut faire le travail. Mais c'est moche et consommateur d'énergie: alors que c'est vrai, do if ["$ (ps -efl | grep $ PIDN | wc -l)" -lt 1] then
; pause fi sommeil 5 terminé@RomeoNinov Je pense que cela ne fonctionnerait pas sur
un ordinateur distantcomme l'a dit l'OP@ChatterOne ça va, j'utilise ssh et screen
@RomeoNinov merci, je l'ai lancé, attendons que le programme s'arrête :)
@RomeoNinov Je voulais dire que vous deviez d'abord lancer SSH, bien sûr, ce qui n'est pas inclus dans la commande que vous avez suggérée
@ChatterOne, oui, et créez le script. Et lancez-le (ça peut être en arrière-plan)