Existe-t-il un moyen de vérifier combien de temps il reste à un processus "sleep" en cours d'exécution avant qu'il ne s'arrête dans le terminal ?
Réponses
Trop de publicités?La commande de sommeil en elle-même n'offre aucun service permettant de contrôler le temps de sommeil restant. Elle n'est également affichée nulle part.
Comme la commande sleep fonctionne sans émettre une série d'appels système pour le noyau, vous ne pourrez pas non plus utiliser un outil de débogage typique tel que dtruss. Si vous essayez d'utiliser le débogueur lldb pour vous attacher au processus, vous constaterez que la commande sleep est également interrompue et ne peut être poursuivie.
Il n'est donc pas possible en tant que tel de déterminer très précisément le temps restant. Si vous pouvez vous contenter d'un résultat imprécis, procédez comme suit :
Exécutez d'abord cette commande :
ps xa | grep sleep
Cela devrait vous montrer la commande de sommeil avec le nombre de secondes qu'il est censé dormir au total. Par exemple :
1234 s0123 S+ 0:00.01 sleep 789
Ici, 789 est le nombre de secondes que la commande est censée dormir au total.
Ensuite, exécutez cette commande :
ps xa -o etime,command -c | grep sleep
Il vous indiquera la durée totale d'exécution du processus :
03:15 sleep
Cela signifie que le processus a dormi pendant 3 minutes et 15 secondes = 195 secondes. Le temps de sommeil restant est de 789 - 195 = 594 secondes.
Si votre version de ps
soutient etimes
( etime
sur secondes ) (malheureusement non pris en charge sur MacOS), vous pouvez l'utiliser pour calculer le temps restant :
ps xa -o etimes,command | awk '/[s]leep/ {print "time remaining for", $2, "is", $3 - $1, "seconds"}'
Exemple de sortie :
time remaining for sleep is 94 seconds
Ou vous pouvez simplifier cela pour ne montrer que le numéro :
ps xa -o etimes,command | awk '/[s]leep/ {print $3 - $1}'
Ces commandes sortiront plus d'une ligne si plusieurs sleep
est en cours d'exécution.
Note : Ni l'un ni l'autre etime
ni etimes
produit des secondes fractionnelles, mais sleep
peut les accepter comme un argument. Cela affectera probablement la précision de votre calcul.
Pour MacOS et autres sans etimes
vous pouvez convertir etime
( ddd-hh:mm:ss
) aux secondes en inversant les calculs effectués dans la source de ps
(en print.c
) :
ps xa -o etimes,command | awk '
BEGIN {
f = "1 60 3600 86400";
split(f, factors)
}
/[s]leep/ {
split($1, parts, "[-:]");
count = length(parts);
for (i = count; i > 0; i--) {
e += parts[i] * factors[count + 1 - i]
};
print e;
e = 0
}'