Durma com minutos e segundos

15

Eu sei como dormir 5m por 5 minutos.

Como eu o usaria por 7 minutos e 30 segundos?

fixit7
fonte

Respostas:

31

Na página de manual :

Dados dois ou mais argumentos, faça uma pausa pela quantidade de tempo especificada pela soma de seus valores .

Então:

sleep 7m 30s
PerlDuck
fonte
2
Bom, eu tenho que ler páginas man mais cuidado ...
Ravexina
4
Pode ser interessante notar que esse é bashum sleep comportamento interno e GNU . POSIXly, sleepé necessário entender apenas números inteiros como segundos #
Sergiy Kolodyazhnyy 13/08/18
17

Outra maneira de fazer isso é:

sleep 7.5m

man sleep

Diferente da maioria das implementações que exigem NUMBER como um número inteiro, aqui NUMBER pode ser um número de ponto flutuante arbitrário.

Ravexina
fonte
10

Já existem duas excelentes respostas, mas eu gostaria de expandir um pouco. Copie e cole o comando abaixo em seu terminal:

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

Isso iniciará um segundo processo que dormirá por 3 dias, 5 horas, 7 minutos e 30,05 segundos. O ID do processo (PID) está 7321no meu caso.

Para confirmar o uso do 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

A primeira entrada é a que nos interessa. A segunda entrada é para um programa permanente em execução na inicialização. A terceira entrada é para o próprio comando grep.

Agora, para ver quanto tempo resta (em segundos) para o sleepcomando gerado pelo PID 7321, podemos usar o seguinte: Como determinar a quantidade de tempo restante em uma "suspensão"? comando:

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

O código para o comando que você pode incluir no seu ~/.bashrcarquivo:

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
fonte
Meu tempo restante não está funcionando. andy @ 7_ ~ $ restantes_sleep_time 7321 restantes_sleep_time: comando não encontrado
fixit7
11
@ fixit7 remaining_sleep_timeprecisa ser copiado para o seu ~/.bashrcarquivo de acordo com o link. Você também pode colocar o código em um arquivo de script bash.
WinEunuuchs2Unix 12/08/18
5

O comando sleep está sempre contando em segundos. Você pode usar ((7x60) +30) segundos e digitar simplesmente:

sono 450

dschinn1001
fonte
3
Como observado anteriormente , sleep realmente sempre compreende segundos, mas no caso de GNU sleep e Bash shell (não tenho certeza sobre ksh e zsh) - eles também permitem argumentos de letra, conforme observado em outras respostas. A sua resposta poderia ser melhorado com o uso de shell expansão aritmética, então algo como sleep $((60*7))poderia ser usado para minutos
Sergiy Kolodyazhnyy