Eu tenho:
sleep 210m && for i in $(seq 1 5); do echo -e '\a'; sleep 0.5; done
funcionando como um timer simples e sem frescuras para me lembrar quando algo deve ser feito. Esse sleep 210m
é o PID 25347.
Estou tentando descobrir quanto tempo resta no sono. O melhor que eu inventei, colocando a quantidade de sono original (210 minutos) é:
$ echo "210 60 * $(ps -o etimes= 25347) - 60 ~ r n [:] P p" | dc
78:11
(Explicação: O primeiro bit calcula o número de segundos no sono original; o $(ps…)
bit obtém o tempo desde o início do sono em segundos e o restante os subtrai e é exibido em minutos e segundos.)
Ocorre-me que isso seria útil em geral; Existe uma maneira melhor de fazer isso? Ou pelo menos uma maneira inteligente de analisar o tempo de sono ps -o args
?
sh -c 'sleep 1; sleep 2'
com muitassh
implementações, é o mesmo processo que executash
e depoissleep 2
(1 segundo depois).exec
). Mas esse é um bom ponto para qualquer solução geral.mksh
eksh93
pelo menos) foramsleep
incorporados (para que não apareçamps
)., Você precisa saber com antecedência com quaissleep
implementações está lidando.Respostas:
O suporte a
sleep
argumentos GNU ou Solaris 11 (uma ou mais<double>[smhd]
durações, também funcionaria com implementações tradicionais que suportam apenas um número inteiro decimal (como no FreeBSD), mas não com aqueles que aceitam argumentos mais complexos como durações ISO-8601 ). Usando emetime
vez deetimes
mais portátil (Unix padrão).(
s/\?//g
é para se livrar dos?
caracteres queprocps
'ps
usam como substitutos dos caracteres de controle. Sem ele, ele falharia em analisarsleep $'\r1d'
ousleep $'\t1d'
... Infelizmente, em alguns locais, incluindo oC
local, ele usa em.
vez de?
. Não há muito o que fazer nesse caso, como não há como diferenciar a\t5d
partir de.5d
(meio dia)).Passe o pid como argumento.
Isso também pressupõe que o
argv[0]
passado parasleep
não contém espaços em branco e que o número de argumentos é pequeno o suficiente para que não seja truncadops
.Exemplos:
Para uma
[[[ddd-]HH:]MM:]SS
saída em vez de apenas o número de segundos, substituaprint $t
por:fonte
0xffp-6d
... Agora, esse é um caso de teste! Mas, na verdade GNU sono leva as coisas comosleep 1h 30m
bem ...sleep 1h -1m
que funciona no Solaris 11, mas não no GNUsleep
. De volta à prancheta. Pelo menos, ele não suporta durações de iso8601 como ksh93, o que seria muito mais difícil.sleep
seja colocada em pausa. Pode até exibir valor negativo neste caso.remaining_sleep_time 12838
retornou-40642
. Pode estar em "Pausar" como estados @rush, mas não sabe como depurar?Parecia um problema divertido de resolver; Como o thrig abordou uma opção perl, aqui está um script bash que faz algo semelhante. Não faz verificação de erro suficiente (pressupõe que você esteja passando um PID válido de um comando de suspensão). Ele lida com a mesma sintaxe que o coreutils do GNU dorme , a saber:
fonte
sleep 0.5d
ousleep 1e5
ousleep infinity
). Mudarbash
para um shell que suporta pontos flutuantes como zsh, ksh93 ou yash ajudaria. Não queetimes
não seja portátil.perl
Isso pode ser melhor realizado com um script que mostre o tempo restante quando o bônus é feito com um
QUIT
(normalmente control+\) ouINFO
sinal.fonte
zsh
'ssched
e oat
comando para outra abordagem que permite consultar o tempo.Deve ser fácil o suficiente com o módulo tqdm python.
Mostra uma barra de progresso visual agradável e pode ser usado como um pipe unix.
https://pypi.python.org/pypi/tqdm
O seguinte snippet de python conta 100 segundos
55% | ██████████ | 55/100 [00:55 <00:45, 1,00s / it]
fonte