Как определить количество времени, оставшееся в состоянии «сна»?

Обновление ядра устранило проблему с nl80211 hostapd, теперь работает отлично.

Мне также удалось найти модифицированный двоичный файл , который заставил hostapd работать со старой версией ядра с использованием драйвера rtl871xdrv для RTL8188CUS совместимых наборов микросхем. установите hostapd и замените измененную версию.

#save original 
sudo mv /usr/sbin/hostapd /usr/sbin/hostapd.bak
#move modified version
sudo mv hostapd /usr/sbin/hostapd
sudo chown root.root /usr/sbin/hostapd
sudo chmod 755 /usr/sbin/hostapd

11
05.10.2016, 19:05
5 ответов

Поддержка GNU или Solaris 11 sleep аргументов (одна или несколько [smhd] длительностей, поэтому также будет работать с традиционными реализациями, поддерживающими только одно десятичное целое число (например, на FreeBSD), но не с теми, кто принимает более сложные аргументы, такие как длительность ISO-8601 ). Использование etime вместо etimes , поскольку это более переносимо (стандартный Unix).

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

( s / \? // g должен избавиться от символов ? , которые procps ' ps использует как замена управляющих символов. Без нее не удалось бы проанализировать sleep $ '\ r1d' или sleep $ '\ t1d' ... К сожалению, в некоторых регионах, включая Локаль C , он использует . вместо ? . В этом случае мы мало что можем сделать, так как невозможно определить \ t5d из .5d (полдня)).

Передайте идентификатор идентификатора в качестве аргумента.

Это также предполагает, что argv [0] , переданный в sleep , не содержит пробелов и что количество аргументов достаточно мало, чтобы оно не усекалось ps .

Примеры:

$ sleep infinity & remaining_sleep_time "$!"
Inf
$ sleep 0xffp-6d &
$ remaining_sleep_time "$!"
344249
$ sleep 1m 1m 1m 1m 1m & remaining_sleep_time "$!"
300

Для вывода [[[ddd-] HH:] MM:] SS вместо количества секунд замените print $ t на :

$output = "";
for ([60,"%02d\n"],[60,"%02d:"],[24,"%02d:"],[inf,"%d-"]) {
  last unless $t;
  $output = sprintf($_->[1], $t % $_->[0]) . $output;
  $t = int($t / $_->[0])
}
printf "%s", $output;
5
27.01.2020, 19:59

Это может быть лучше с помощью скрипта, который может показывать оставшееся время при отключении с помощью сигнала QUIT (обычно control + \ ) или INFO .

#!/usr/bin/env perl
#
# snooze - sleep for a given duration, with SIGINFO or SIGQUIT
# (control+\ typically) showing how much time remains. Usage:
#
#   snooze 3m; make-noise-somehow
#
# or with
#
#   snooze 25m bread; make-noise-somehow
#
# one can then elsewhere
#
#   pkill -INFO snooze-bread

use strict;
use warnings;
use Term::ReadKey qw(ReadMode);

my %factors = ( s => 1, m => 60, h => 3600, d => 86400 );

my $arg = shift or die "Usage: $0 sleep-time [label]\n";
my $to_sleep = 0;
while ( $arg =~ m/([0-9]+)([smhd])?/g ) {
    my $value  = $1;
    my $factor = $2;
    $value *= $factors{$factor} if $factor;
    $to_sleep += $value;
}
die "nothing to die to sleep to sleep no more for\n" if $to_sleep == 0;

my $label = shift;
$0 = $label ? "snooze-$label" : "snooze";

ReadMode 2;    # noecho to hide control+\s from gunking up the message

sub remainder { warn "$0: " . deltatimefmt($to_sleep) . " remaining\n" }

sub restore {
    ReadMode 0;
    warn "$0: " . deltatimefmt($to_sleep) . " remainds\n";
    exit 1;
}

# expect user to mash on control+\ or whatever generates SIGINFO
for my $name (qw/ALRM INFO QUIT/) {
    $SIG{$name} = \&remainder;
}

# back to original term settings if get blown away
for my $name (qw/HUP INT TERM USR1 USR2/) {
    $SIG{$name} = \&restore;
}

$SIG{TSTP} = 'IGNORE';    # no Zees for you!

while ( $to_sleep > 0 ) {
    $to_sleep -= sleep $to_sleep;
}

ReadMode 0;
exit;

sub deltatimefmt {
    my $difference = shift;

    return "0s" if $difference == 0;

    my $seconds = $difference % 60;
    $difference = ( $difference - $seconds ) / 60;
    my $minutes = $difference % 60;
    $difference = ( $difference - $minutes ) / 60;

    #  my $hours = $difference;
    my $hours = $difference % 24;
    $difference = ( $difference - $hours ) / 24;
    my $days  = $difference % 7;
    my $weeks = ( $difference - $days ) / 7;

    # better way to do this?
    my $temp = ($weeks) ? "${weeks}w " : q{};
    $temp .= ($days)    ? "${days}d "    : q{};
    $temp .= ($hours)   ? "${hours}h "   : q{};
    $temp .= ($minutes) ? "${minutes}m " : q{};
    $temp .= ($seconds) ? "${seconds}s"  : q{};
    return $temp;
}
1
27.01.2020, 19:59

Решать эту задачу казалось забавным; поскольку thrig охватывает параметр perl, вот сценарий bash, который делает нечто подобное. Он не выполняет достаточную проверку ошибок (предполагается, что вы передаете действительный PID команды сна). Он обрабатывает тот же синтаксис, что и GNU coreutils sleep , а именно:

  • суффиксы s | m | h | d для секунд / минут / часов / дней
  • несколько параметров времени складываются вместе

#!/usr/bin/env bash

# input: PID of a sleep command
# output: seconds left in the sleep command

function parse_it_like_its_sleep {
  # $1 = one sleep parameter
  # print out the seconds it translates to

  mult=1
  [[ $1 =~ ([0-9][0-9]*)(s|m|h|d) ]] && {
    n=${BASH_REMATCH[1]}
    suffix=${BASH_REMATCH[2]}
  } || {
    n=$1
  }
  case $suffix in
    # no change for 's'
    (m) mult=60;;
    (h) mult=$((60 * 60));;
    (d) mult=$((60 * 60 * 24));;
  esac
  printf %d $((n * mult))
}

# TODO - some sanity-checking for $1
set -- $(ps -o etimes=,args= $1)
[[ $2 = "sleep" ]] || exit 1
elapsed=$1
shift 2
total=0
for arg
do
  # TODO - sanity-check $arg
  s=$(parse_it_like_its_sleep $arg)
  total=$((total + s))
done
printf "%d seconds left\n" $((total - elapsed))
3
27.01.2020, 19:59

Должно быть достаточно просто с модулем python tqdm.

Показывает красивый визуальный индикатор выполнения и может использоваться как конвейер unix.

https://pypi.python.org/pypi/tqdm

Следующий фрагмент кода Python считает 100 секунд

import time
from tqdm import tqdm
for i in tqdm(range(100)):
    time.sleep(1)

55% | ██████████ | 55/100 [00:55 <00:45, 1,00 с / it]

0
27.01.2020, 19:59

Если вы ищете простое решение, вы можете просто использовать ps aux, который показывает время НАЧАЛА . Но вы можете использовать его только для быстрого приближения, а не для получения точного значения.

В этом примере время начала — 15 :47. Таким образом, сон закончится примерно в 15 :57

enter image description here

1
27.04.2020, 16:05

Теги

Похожие вопросы