У меня есть:
sleep 210m && for i in $(seq 1 5); do echo -e '\a'; sleep 0.5; done
работает как простой, без излишеств таймер, чтобы напомнить мне, когда что-то должно быть сделано. Это sleep 210m
PID 25347.
Я пытаюсь выяснить, сколько времени осталось во сне. Лучшее, что я придумал, когда я положил исходное количество сна (210 минут):
$ echo "210 60 * $(ps -o etimes= 25347) - 60 ~ r n [:] P p" | dc
78:11
(Пояснение: Первый бит вычисляет количество секунд в исходном сне; $(ps…)
бит получает время с момента начала сна в секундах, затем остальные вычитают их и отображают в минутах и секундах.)
Мне кажется, это было бы полезно в целом; Есть лучший способ это сделать? Или хотя бы умный способ разобрать время сна ps -o args
?
sh -c 'sleep 1; sleep 2'
многихsh
реализациях это тот же процесс, который выполняетсяsh
и выполняется позжеsleep 2
(через 1 секунду).exec
). Но это хороший момент для любого общего решения.mksh
иksh93
по крайней мере) имеютsleep
встроенные функции (поэтому не будут отображаться в нихps
). Вам необходимо заранее знать, с какимиsleep
реализациями вы имеете дело.Ответы:
Поддержка
sleep
аргументов GNU или Solaris 11 (одна или несколько<double>[smhd]
длительностей, поэтому также будет работать с традиционными реализациями, которые поддерживают только одно десятичное целое число (как во FreeBSD), но не с теми, которые принимают более сложные аргументы, такие как длительности ISO-8601 ). Использованиеetime
вместо того,etimes
чтобы быть более переносимым (стандартный Unix).(
s/\?//g
, чтобы избавиться от?
символов , которыеprocps
"ps
использования в качестве замены для управляющих символов. Без него было бы не разобратьsleep $'\r1d'
илиsleep $'\t1d'
... К сожалению, в некоторых местах, в том числеC
местности, он использует.
вместо?
. Не так много мы можем сделать в этом случае, поскольку нет никакого способа отличить\t5d
от.5d
(полдня)).Передайте pid в качестве аргумента.
Это также предполагает, что
argv[0]
переданный tosleep
не содержит пробелов и что количество аргументов достаточно мало, чтобы оно не было усеченоps
.Примеры:
Для
[[[ddd-]HH:]MM:]SS
вывода вместо количества секунд замените наprint $t
:источник
0xffp-6d
... Теперь это тестовый пример! Но на самом деле сон GNU принимает такие вещи, какsleep 1h 30m
...sleep 1h -1m
который работает на Solaris 11, но не на GNUsleep
. Вернуться к доске для рисования. По крайней мере, он не поддерживает длительности iso8601, такие как ksh93, что будет намного сложнее.sleep
поставить на паузу. В этом случае может даже отображаться отрицательное значение.remaining_sleep_time 12838
вернулся-40642
. Это может быть в состоянии «Пауза», когда @rush заявляет, но вы не знаете, как отлаживать?Это казалось забавной проблемой для решения; так как триг покрывал параметр perl, вот скрипт bash, который делает нечто подобное. Он не выполняет достаточную проверку ошибок (предполагается, что вы передаете действительный PID команды ожидания). Он обрабатывает тот же синтаксис, что и GNU coreutils sleep , а именно:
источник
sleep 0.5d
илиsleep 1e5
илиsleep infinity
).bash
Помогло бы переключение с оболочки на плавающие точки, такие как zsh, ksh93 или yash. Не то, чтоetimes
не является портативным.perl
Это может быть лучше сделано с помощью сценария, который может показать оставшееся время, когда он связан с
QUIT
(обычно control+\) илиINFO
сигналом.источник
zsh
«Ssched
иat
команды для другого подхода , который позволяет запрашивая время.Должно быть достаточно просто с модулем Python tqdm.
Показывает приятный визуальный индикатор выполнения и может использоваться в качестве конвейера Unix.
https://pypi.python.org/pypi/tqdm
Следующий фрагмент кода Python насчитывает 100 секунд
55% | ██████████ | 55/100 [00:55 <00:45, 1,00s / it]
источник