J'ai:
sleep 210m && for i in $(seq 1 5); do echo -e '\a'; sleep 0.5; done
fonctionnant comme une minuterie simple et sans fioritures pour me rappeler quand quelque chose doit être fait. C'est le sleep 210m
PID 25347.
J'essaie de comprendre combien de temps il reste dans le sommeil. Le meilleur que j'ai trouvé, avec moi en mettant la quantité de sommeil originale (210 minutes) est:
$ echo "210 60 * $(ps -o etimes= 25347) - 60 ~ r n [:] P p" | dc
78:11
(Explication: le premier bit calcule le nombre de secondes dans la veille d'origine; le $(ps…)
bit obtient le temps écoulé depuis le début de la veille en secondes, puis le reste les soustrait et s'affiche en minutes et secondes.)
Il me semble que ce serait utile en général; Y a-t-il une meilleure manière de faire cela? Ou au moins une façon intelligente d'analyser le temps de sommeil ps -o args
?
sh -c 'sleep 1; sleep 2'
avec de nombreusessh
implémentations, c'est le même processus qui s'exécutesh
et s'exécute plus tardsleep 2
(1 seconde plus tard).exec
). Mais c'est un bon point pour toute solution générale.mksh
etksh93
au moins) sontsleep
intégrés (donc ne s'afficheraient pasps
)., Vous devez savoir à l'avance avec quellessleep
implémentations vous avez affaire.Réponses:
Prenant en charge les
sleep
arguments GNU ou Solaris 11 (une ou plusieurs<double>[smhd]
durées, cela fonctionnerait également avec les implémentations traditionnelles qui prennent en charge un seul nombre entier décimal (comme sur FreeBSD), mais pas avec celles acceptant des arguments plus complexes comme les durées ISO-8601 ). Utiliseretime
au lieu deetimes
car c'est plus portable (Unix standard).(
s/\?//g
est de se débarrasser des?
caractères quiprocps
«ps
remplacent les caractères de contrôle. Sans lui, il ne parviendrait pas à analysersleep $'\r1d'
ousleep $'\t1d'
... Malheureusement, dans certains paramètres régionaux, y compris lesC
paramètres régionaux, il utilise à la.
place de?
. Pas grand-chose que nous pouvons faire dans ce cas, car il n'y a aucun moyen de distinguer un à\t5d
partir d'une.5d
(demi-journée)).Passez le pid comme argument.
Cela suppose également que le
argv[0]
passé àsleep
ne contient pas de blancs et que le nombre d'arguments est suffisamment petit pour qu'il ne soit pas tronqué parps
.Exemples:
Pour une
[[[ddd-]HH:]MM:]SS
sortie au lieu de simplement le nombre de secondes, remplacez leprint $t
par:la source
0xffp-6d
... Maintenant, c'est un cas de test! Mais en fait, GNU sleep prend des choses comme çasleep 1h 30m
aussi ...sleep 1h -1m
ce qui fonctionne sur Solaris 11 mais pas avec GNUsleep
. Retour à la planche à dessin. Au moins, il ne prend pas en charge les durées iso8601 comme ksh93, ce qui serait beaucoup plus difficile.sleep
serait mise en pause. Il pourrait même afficher une valeur négative dans ce cas.remaining_sleep_time 12838
revenu aujourd'hui-40642
. Cela pourrait être sur "Pause" comme le dit @rush mais vous ne savez pas comment déboguer?Cela semblait être un problème amusant à résoudre; depuis que thrig a couvert une option perl, voici un script bash qui fait quelque chose de similaire. Il ne fait pas assez de vérification d'erreurs (il suppose que vous passez un PID valide d'une commande sleep). Il gère la même syntaxe que le sommeil coreutils de GNU , à savoir:
la source
sleep 0.5d
ousleep 1e5
ousleep infinity
). Passer d'bash
un shell prenant en charge les virgules flottantes comme zsh, ksh93 ou yash serait utile. Ceetimes
n'est pas portable.perl
Cela pourrait être mieux fait avec un script qui peut montrer le temps restant quand bonked avec un
QUIT
(généralement control+\) ou unINFO
signal.la source
zsh
'ssched
et laat
commande pour une autre approche qui permet d'interroger l'heure.Devrait être assez facile avec le module python tqdm.
Affiche une belle barre de progression visuelle et peut être utilisé comme un tube Unix.
https://pypi.python.org/pypi/tqdm
L'extrait de code python suivant compte 100 secondes
55% | ██████████ | 55/100 [00:55 <00:45, 1.00s / it]
la source