Mam:
sleep 210m && for i in $(seq 1 5); do echo -e '\a'; sleep 0.5; done
działa jako prosty, bezproblemowy licznik czasu, który przypomina mi, kiedy należy coś zrobić. To sleep 210m
jest PID 25347.
Próbuję dowiedzieć się, ile czasu pozostało we śnie. Najlepsze, co wymyśliłem, gdy wprowadziłem oryginalną ilość snu (210 minut) to:
$ echo "210 60 * $(ps -o etimes= 25347) - 60 ~ r n [:] P p" | dc
78:11
(Objaśnienie: Pierwszy bit oblicza liczbę sekund w pierwotnym śnie; $(ps…)
bit uzyskuje czas od rozpoczęcia snu w sekundach, a następnie reszta odejmuje je i wyświetla w minutach i sekundach.)
Wydaje mi się, że byłoby to ogólnie przydatne; czy jest na to lepszy sposób? A przynajmniej sprytny sposób na przeanalizowanie czasu snu ps -o args
?
sh -c 'sleep 1; sleep 2'
przypadku wielush
implementacji jest to ten sam proces, który wykonuje sięsh
i wykonuje późniejsleep 2
(1 sekunda później).exec
). Ale to dobry punkt na każde ogólne rozwiązanie.mksh
aksh93
przynajmniej) masleep
wbudowanych (więc się nie pojawiłops
), musisz wcześniej wiedzieć, z którymisleep
implementacjami masz do czynienia.Odpowiedzi:
Obsługa
sleep
argumentów GNU lub Solaris 11 (jeden lub więcej<double>[smhd]
czasów trwania, więc działałoby to również z tradycyjnymi implementacjami, które obsługują tylko jedną dziesiętną liczbę całkowitą (jak w FreeBSD), ale nie z tymi, które akceptują bardziej złożone argumenty, takie jak czasy trwania ISO-8601 ). Używanieetime
zamiastetimes
tego jest bardziej przenośne (standardowy Unix).(
s/\?//g
polega na pozbyciu się?
znaków, któreprocps
„ps
zastępują znaki kontrolne. Bez niego nie byłby parsowanysleep $'\r1d'
lubsleep $'\t1d'
… Niestety, w niektórych lokalizacjach, w tym wC
ustawieniach regionalnych, używa.
zamiast tego?
. Niewiele możemy zrobić w takim przypadku, ponieważ nie ma możliwości odróżnienia\t5d
od.5d
(pół dnia).Podaj pid jako argument.
Zakłada to również, że
argv[0]
przekazane dosleep
nie zawiera spacji i że liczba argumentów jest na tyle mała, że nie jest obcinanaps
.Przykłady:
Aby uzyskać
[[[ddd-]HH:]MM:]SS
wynik zamiast samej liczby sekund, zamień naprint $t
:źródło
0xffp-6d
... To jest przypadek testowy! Ale tak naprawdę sen GNU wymaga również takich rzeczysleep 1h 30m
...sleep 1h -1m
który działa na Solarisie 11, ale nie na GNUsleep
. Powrót do tablicy kreślarskiej. Przynajmniej nie obsługuje czasów trwania iso8601, takich jak ksh93, co byłoby znacznie trudniejsze.sleep
zostanie wstrzymane. W tym przypadku może nawet wyświetlać wartość ujemną.remaining_sleep_time 12838
wróciłem-40642
. Może być na „Pause”, jak mówi @rush, ale nie wiesz, jak debugować?To wydawało się zabawnym problemem do rozwiązania; ponieważ thrig obejmował opcję perla, oto skrypt bash, który robi coś podobnego. Nie wykonuje wystarczającej kontroli błędów (zakłada, że przekazujesz prawidłowy PID polecenia uśpienia). Obsługuje tę samą składnię, co snu coreutils GNU , a mianowicie:
źródło
sleep 0.5d
lubsleep 1e5
lubsleep infinity
).bash
Pomocne byłoby przełączenie z powłoki obsługującej zmiennoprzecinkowe, takie jak zsh, ksh93 lub yash. Nieetimes
to nie jest przenośne.perl
Można to lepiej zrobić za pomocą skryptu, który może pokazywać pozostały czas, gdy zostaniesz ostrzeżony
QUIT
(zwykle control+\) lubINFO
sygnałem.źródło
zsh
„ssched
orazat
polecenia dla innego podejścia, które pozwala na wysłanie zapytania do czasu.Powinno to być dość łatwe dzięki modułowi python tqdm.
Pokazuje ładny wizualny pasek postępu i może być używany jako potok unix.
https://pypi.python.org/pypi/tqdm
Poniższy fragment kodu w Pythonie liczy 100 sekund
55% | ██████████ | 55/100 [00:55 <00:45, 1.00s / it]
źródło