Используйте сон с минутами и секундами

16

Я умею спать 5м по 5 минут.

Как бы я использовал это, скажем, 7 минут 30 секунд?

fixit7
источник

Ответы:

32

Из справочной страницы :

Учитывая два или более аргумента, делайте паузу на количество времени, указанное в сумме их значений .

Так:

sleep 7m 30s
PerlDuck
источник
2
Хорошо, я должен читать man-страницы более внимательно ...
Ravexina
4
Стоит отметить, что это bashвстроенное sleep поведение GNU . POSIXly, sleepтребуется только для того, чтобы понимать целые числа как секунды
Сергей Колодяжный
17

Еще один способ сделать это:

sleep 7.5m

man sleep

В отличие от большинства реализаций, которые требуют, чтобы NUMBER был целым числом, здесь NUMBER может быть произвольным числом с плавающей запятой.

Ravexina
источник
10

Уже есть два отличных ответа, но я бы хотел немного расширить. Скопируйте и вставьте команду ниже в свой терминал:

$ sleep 3d 5h 7m 30.05s &
[1] 7321

Это запустит второй процесс, который будет спать 3 дня, 5 часов, 7 минут и 30,05 секунды. Идентификатор процесса (PID) 7321в моем случае.

Для подтверждения использования PID

$ ps aux | grep sleep
rick      7321  0.0  0.0  14356   660 pts/2    S    22:40   0:00 sleep 3d 5h 7m 30.05s
root     12415  0.0  0.0  14356   700 ?        S    22:41   0:00 sleep 60
rick     12500  0.0  0.0  21292   968 pts/2    R+   22:41   0:00 grep --color=auto sleep

Первая запись - это та, которая нас интересует. Вторая запись предназначена для постоянной программы, которую я запускаю при запуске. Третья запись предназначена для самой команды grep.

Теперь, чтобы увидеть, сколько времени осталось (в секундах) для sleepкоманды, сгенерированной PID, 7321мы можем использовать это: Как определить количество времени, оставшегося в «сне»? команда:

$ remaining_sleep_time 7321
277304.05
$ remaining_sleep_time 7321
277296.05
$ remaining_sleep_time 7321
277262.05

Код команды, который вы можете включить в свой ~/.bashrcфайл:

remaining_sleep_time() { # arg: pid
  ps -o etime= -o args= -p "$1" | perl -MPOSIX -lane '
    %map = qw(d 86400 h 3600 m 60 s 1);
    $F[0] =~ /(\d+-)?(\d+:)?(\d+):(\d+)/;
    $t = -($4+60*($3+60*($2+24*$1)));
    for (@F[2..$#F]) {
      s/\?//g;
      ($n, $p) = strtod($_);
      $n *= $map{substr($_, -$p)} if $p;
      $t += $n
    }
    print $t'
}
WinEunuuchs2Unix
источник
Мое оставшееся время не работает. andy @ 7_ ~ $ Остаток_Слайпа 7321 Остаток_Спуска_: команда не найдена
fixit7
1
@ fixit7 remaining_sleep_timeнеобходимо скопировать в ваш ~/.bashrcфайл по ссылке. Вы также можете поместить код в файл сценария bash.
WinEunuuchs2Unix
5

Командный сон всегда считается в секундах. Вы можете использовать ((7x60) +30) секунд, а затем просто набрать:

сон 450

dschinn1001
источник
3
Как отмечалось ранее , sleep действительно всегда понимает секунды, но в случае GNU sleep и оболочки Bash (не уверен насчет ksh и zsh) - они также допускают буквенные аргументы, как отмечено в других ответах. Ваш ответ может быть улучшен с помощью арифметического расширения оболочки, так что что-то подобное sleep $((60*7))можно использовать в течение нескольких минут
Сергей Колодяжный