Użyj snu z minutami i sekundami

16

Wiem, jak korzystać ze snu 5m przez 5 minut.

Jak mam go używać przez powiedzmy 7 minut 30 sekund?

fixit7
źródło

Odpowiedzi:

32

Z strony podręcznika :

Biorąc pod uwagę dwa lub więcej argumentów, zatrzymaj się na czas określony przez sumę ich wartości .

Więc:

sleep 7m 30s
PerlDuck
źródło
2
Fajnie, muszę uważniej czytać strony
podręcznika
4
Warto zauważyć, że jest to bashwbudowane i sleep zachowanie GNU . POSIXly sleepjest wymagany tylko do zrozumienia liczb całkowitych w sekundach
Sergiy Kolodyazhnyy
17

Innym sposobem na to jest:

sleep 7.5m

man sleep

W przeciwieństwie do większości implementacji, które wymagają, aby NUMBER był liczbą całkowitą, tutaj NUMBER może być dowolną liczbą zmiennoprzecinkową.

Ravexina
źródło
10

Istnieją już dwie doskonałe odpowiedzi, ale chciałbym trochę rozwinąć. Skopiuj i wklej poniższe polecenie do terminala:

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

Rozpocznie się drugi proces, który będzie spał przez 3 dni, 5 godzin, 7 minut i 30,05 sekundy. Identyfikator procesu (PID) jest 7321w moim przypadku.

Aby potwierdzić użycie 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

Pierwszy wpis jest tym, który nas interesuje. Drugi wpis dotyczy stałego programu, który mam uruchomiony podczas uruchamiania. Trzeci wpis dotyczy samego polecenia grep.

Teraz, aby zobaczyć, ile czasu pozostało (w sekundach) na sleeppolecenie wygenerowane przez PID 7321, możemy użyć tego: Jak określić czas pozostały do ​​„snu”? Komenda:

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

Kod polecenia, które możesz dołączyć do ~/.bashrcpliku:

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
źródło
Mój pozostały czas nie działa. andy @ 7_ ~ $ Pozostały czas snu 7321 pozostały czas snu: nie znaleziono polecenia
fixit7
1
@ fixit7 remaining_sleep_timenależy skopiować do ~/.bashrcpliku zgodnie z linkiem. Możesz także umieścić kod w pliku skryptu bash.
WinEunuuchs2Unix
5

Sen poleceń zawsze liczy się w sekundach. Możesz użyć ((7x60) +30) sekund, a następnie po prostu wpisać:

spać 450

dschinn1001
źródło
3
Jak wspomniano wcześniej , sleep rzeczywiście zawsze rozumie sekundy, ale w przypadku GNU sleep i powłoki Bash (nie jestem pewien co do ksh i zsh) - pozwalają one również na argumenty literowe, jak zauważono w innych odpowiedziach. Twoja odpowiedź może zostać poprawiona za pomocą rozszerzenia arytmetycznego powłoki, więc coś takiego sleep $((60*7))można wykorzystać przez kilka minut
Sergiy Kolodyazhnyy