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?

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

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ą.


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'
}

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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.