Welcome, Guest. Please login or register.

Login with username, password and session length

 
Advanced search

10 558 Posts in 5 933 Topics- by 1 216 Members - Latest Member: santini862

23 November 2019, 06:34
Select Language English | Russian ru | German
Main PageIRC Client KVIrc forumRussian talksСкриптингГотовые скриптыРеализация uptime для Linux & Windows
Pages: [1] 2
Print
Author Topic: Реализация uptime для Linux & Windows  (Read 78399 times)
0 Members and 1 Guest are viewing this topic.
SiRuS
Новичок
*

Репутация: 1
Gender: Male
Posts: 18


438340842
View Profile
« on: 15 August 2007, 18:58 »

Сам скрипт написан, вопрос только в "запоминании" максимального аптайма. Как лучше сделать? Через свой файл? Или есть другие, более удобные/надёжные/быстрые способы?
« Last Edit: 19 August 2007, 17:21 by Alexey » Logged
Maximusya
Глобальный модератор
*****

Репутация: 49
Gender: Male
Posts: 343



View Profile
« Reply #1 on: 15 August 2007, 20:22 »

Можно и через свой файл, а можно использовать $config функции kvs.
Например, вот такой алиас
Code:
alias(setMaxUptime)
{
if ($0 == "")
{
echo Запоминает максимальное время работы системы
echo Использование:
echo "        setMaxUptime <time>"
echo "        \$setMaxUptime(<time>)"
}
else
{
%cfg = $config.open(myuptime.kvc)
%num = $config.read(%cfg,MaxUptime,0)
echo Предыдущее максимальное время работы: %num
if ($0>%num)
{
config.write %cfg MaxUptime $0
echo Новое максимальное время работы: $0
}
else if ($0<%num)
echo Работали и больше
        else echo Столько уже работали
config.close %cfg
}
}
использует конфиг файл myuptime.kvc (или создает его, если там его нет) для хранения maxuptime.
У меня установка Квирка portable, поэтому файл расположился по пути С:\Program Files\KVIrc\Settings\config\scripts\
То есть сразу в папке моих настроек.
Формат файла уже проработан, придумывать своего не нужно)

Выложи, пожалуйста, свой скрипт uptime)
Logged
SiRuS
Новичок
*

Репутация: 1
Gender: Male
Posts: 18


438340842
View Profile
« Reply #2 on: 16 August 2007, 00:58 »

Время получаем из файла uptime (в этом случае секунды "не пропадают"). А следовательно скрипт будет работать только для *nix систем. Но я надеюсь, что форумчане помогут адаптировать скрипт к другим платформам Wink
Code:
alias(uptime)
{
        #uptime
        #ф-ция расшифровки времени (из секунд)
        function(out_str)
        {
                #расшифровка(%t в секундах)
        %t=$0;
%sec=$int($(%t % 60));
%min=$int($(%t / 60 % 60));
%hour=$int($(%t / 3600 % 24));
%day=$int($(%t / 86400 % 7));
%weak=$int($(%t / 604800));
#и т.д. но смысла особого не вижу.. как и в неделях впрочем
#%t%=7;
#Формируем строку вывода
if(%weak!=0) %str << $string(%weak) weaks;
if(%day!=0) %str << $string(%day) days;
if(%hour!=0) %str << $string(%hour) hours
if(%min!=0) %str << $string(%min) minutes
if(%sec!=0) %str << $string(%sec) seconds
return %str;
        }
        #берём аптайм(доступно для unix пользователей)
        %time=$file.read("/proc/uptime");
        if(%time)
        {
                %s[]=$str.split([ ],%time,r)
                %t=$real(%s[0]);
                #вывод
                me время работы компьютера: $out_str(%t)
                #запись максимального аптайма
                %cfg = $config.open(myuptime.kvc)
                if(%cfg)
                {
                        %num = $config.read(%cfg,MaxUptime,0)
                        if (%t>%num && %num)
                        {
                                me предыдущее максимальное время работы: $out_str(%num)
                                config.write %cfg MaxUptime %t
                        }
                        else if (%t<%num && %num)
                                me работали и больше: $out_str(%num)
                                else
                                        me столько уже работали
                        config.close %cfg
                }
        }
}

Хотел бы уточнить насчёт
Code:
%sec=%t;
%sec%=60;
%t/=60;
Это некрасиво, можно ли сделать запись короче?
И ещё, из-за погрешности округления "старое" время может быть больше/меньше на 1 с.
« Last Edit: 22 August 2007, 00:02 by SiRuS » Logged
Maximusya
Глобальный модератор
*****

Репутация: 49
Gender: Male
Posts: 343



View Profile
« Reply #3 on: 17 August 2007, 02:04 »

Насчет красивости %sec=%t; %sec%=60; и тп:
работает и оператор с двумя операндами Wink %sec = $(%t % 60); %min = $(%t % 3600) и тд

Вот мой скрипт sayuptime для Windows (тестировался только на Windows XP Pro SP2):
Code:
alias(sayuptime)
{
%com = "net stats workstation";
# Запоминаем текущее окно, в которое нужно вывести uptime
%UptimeTargetID = $window
exec -b (%com)
{
if ($0 == "stdout")
{
        %statsOutput = $1
        if (%statsOutput<>"")
        {
        #echo %StatsOutput
        %str = %statsOutput;
        # Вырезаем время загрузки системы
        # И преобразуем его в формат YYYY mm dd hh MM PM|AM
%str =~ s/.*(\\d+)\/(\\d+)\/(\\d+) (\\d+):(\\d+) (AM|PM).*/\\3 \\1 \\2 \\4 \\5 \\6/gi
%tmparr = $str.split(" ", %str)
# Переходим к 24-х часовому формату времени
if (%tmparr[5] == "PM")
%tmparr[3] += 12;

%year = %tmparr[0];
%month = %tmparr[1];
%day = %tmparr[2];
%hour24 = %tmparr[3];
%min = %tmparr[4];

%dim = $array(0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

# Текущее время
%cyear = $date(Y);
%cmonth = $date(m);
%cday = $date(d);
%chour24 = $date(H);
%cmin = $date(M);

# Считаем минуты, часы, дни аптайма
%mins = $(%cmin-%min);             
%hours = $(%chour24-%hour24);
if (%mins < 0)           
{                 
%hours--;                 
%mins += 60;             
}             
%days = $(%cday-%day);           
if (%hours < 0)           
{                 
%days--;                 
%hours += 24;             
}             
             
if (%days < 0)             
{                 
%cmonth--;
if (%cmonth == 0) %cmonth = 12;                 
%days += %dim[%month1];             
}
                         while(%month != %cmonth)
            {
              %days += %dim[%month];
          %month++;
                if (%month == 13) %month = 1;
            }

#echo Uptime is %days d %hours h %mins m
say -r=%UptimeTargetID Uptime is %days d %hours h %mins m
#%Totalminutes =$( $( $(%days*24) + %hours) + %mins)
        }
        else
        {
        echo "No output? :/"
        }
}
}
}


Обновление:
Последняя версия доработанного и протестированного скрипта - в архиве по ссылке в моем следующем посте
Обновление:
17 авг 2007. Выявлена и исправлена некорректная работа при пересечении границы года
Замечания:
1. Требует доработки в плане учета високосных годов (28 или 29 дней в феврале Smiley)
2. Точность ограничена минутой, так как команда net stats workstation выдает время загрузки системы с точностью до минуты.
3. Глобальная переменная %UptimeTargetID введена, потому что у меня никак не получилось использовать второй параметр команды exec - <magic data:variant>, который, судя по хелпу, должен быть доступен внутри callback-функции как параметр $2.
4. Скрипт еще не подвергался всесторонему тестированию в плане верности результатов Smiley

Ваши замечания приветствуются!
« Last Edit: 18 August 2007, 13:04 by Maximusya » Logged
SiRuS
Новичок
*

Репутация: 1
Gender: Male
Posts: 18


438340842
View Profile
« Reply #4 on: 17 August 2007, 03:45 »

Изменил свой скрипт, Maximusya +1 =)
Насчёт лет/месяцев - может и не стоит? В принципе, все утилиты пишут аптайм в днях. Да и числа там некрасивые получаются, при вычислениях.
Logged
Maximusya
Глобальный модератор
*****

Репутация: 49
Gender: Male
Posts: 343



View Profile
« Reply #5 on: 17 August 2007, 19:29 »

Вот доделал uptime (для Windows!)

http://maximusya.at.tut.by/uptime.7z

Сейчас учитываются и високосные годы.
Алиасы устанавливаются в пространство имен UPTIME, а для удобства использования добавлен и простейший алиас sayuptime, который просто вызывает алиас UPTIME::sayuptime.

В архиве также находится файлик с набором тестов, на случай, если будете переделывать алгоритм.
« Last Edit: 18 August 2007, 13:00 by Maximusya » Logged
noLove
Глобальный модератор
*****

Репутация: 17
Posts: 181



View Profile
« Reply #6 on: 17 August 2007, 20:47 »

скрипты не читал.

вопрос такой. нужно аптайм текущей сессии квирка, или сколько времени он был запущен всего?
Logged

Maximusya
Глобальный модератор
*****

Репутация: 49
Gender: Male
Posts: 343



View Profile
« Reply #7 on: 18 August 2007, 13:01 »

Это аптайм операционной системы
Logged
noLove
Глобальный модератор
*****

Репутация: 17
Posts: 181



View Profile
« Reply #8 on: 18 August 2007, 19:50 »

ой! сорру! у вас жы в линуксе можно стандартными срецтвами уптайм получить.... Wink все, вопросов больше не имею
Logged

Maximusya
Глобальный модератор
*****

Репутация: 49
Gender: Male
Posts: 343



View Profile
« Reply #9 on: 19 August 2007, 14:38 »

Эта AM\PM система, чтоб её!
В срипте uptime для Windows исправлена ошибка, связанная с пересчетом времени из 12-и часового в 24-х часовой формат времени. До этого, если система стартовала в первый час после полудня или в первый час после полуночи, аптайм выдавался с ошибкой.
Изменения только в скрипте UPTIME::sayuptime:
Code:
# Переходим к 24-х часовому формату времени
if ((%starttimeArr[5] == "PM") && (%starttimeArr[3] != 12))
    %starttimeArr[3] += 12;
else if ((%starttimeArr[5] == "AM") && (%starttimeArr[3] == 12))
    %starttimeArr[3] = 0;

По прежней ссылке находится обновленный архив:
http://maximusya.at.tut.by/uptime.7z

PS:
А кому интересно узнать подробности об AM|PM, вот статья из википедии (на англ):
http://en.wikipedia.org/wiki/12-hour_clock#Abbreviations
и вот на русском:
http://urban.sfaction.net/ideas/protocol/am&pm/
Logged
PavelSES
Новичок
*

Репутация: 0
Gender: Male
Posts: 12


281246672
View Profile
« Reply #10 on: 21 August 2007, 03:34 »

чтото у меня неработает uptime... выдает ошибку:
===========
[12:32:14] [KVS] Ошибка при выполнении: Правый операнд не определён как число
[12:32:14] [KVS]   в контексте скрипта "UPTIME::SubtractDates", Строка 27, около символа 17
[12:32:14] [KVS] Ошибка при выполнении: Ошибка в псевдониме при обращении к функции 'UPTIME::SubtractDates', вызов из этого контекста
[12:32:14] [KVS]   в контексте скрипта "exec callback", Строка 31, около символа 14
[12:32:14] Ошибка запуска процесса из обработчика: процесс убит
===========
винда 2003 R2 SP2
может кто что подскажет?, заранее спасибо
Logged

Maximusya
Глобальный модератор
*****

Репутация: 49
Gender: Male
Posts: 343



View Profile
« Reply #11 on: 21 August 2007, 11:08 »

Сейчас  скрипт сделан под Windows XP SP2, а у w2k3 другой формат даты в результатах команды net stats workstation.
Насколько я узнал, в w2k3 в выводе команды будет примерно такая строка:
Статистика после 10.08.2007 8:32
Для такого формата в скрипте UPTIME::sayuptime нужно изменить несколько строчек.
Было
Code:
#%str =~ s/.*(\\d+)\/(\\d+)\/(\\d+) (\\d+):(\\d+) (AM|PM).*/\\3 \\1 \\2 \\4 \\5 \\6/gi
%starttimeArr = $str.split(" ", %str)
# Переходим к 24-х часовому формату времени
if ((%starttimeArr[5] == "PM") && (%starttimeArr[3] != 12))
%starttimeArr[3] += 12;
else if ((%starttimeArr[5] == "AM") && (%starttimeArr[3] == 12))
%starttimeArr[3] = 0;
Нужно сделать:
Code:
%str =~ s/.*(\\d+)\.(\\d+)\.(\\d+) (\\d+):(\\d+).*/\\3 \\2 \\1 \\4 \\5/gi
%starttimeArr = $str.split(" ", %str)
то есть изменить строку с регекспом и убрать переход к 24-х часовому формату.

Если опять не сработает, то выполни в cmd команду net stats workstation сам и напиши сюда строчку с датой и временем, разберемся)

И еще. Выполни в Квирке команду /echo $system.osversion и напиши сюда результаты. Большое спасибо!)
« Last Edit: 21 August 2007, 23:08 by Maximusya » Logged
PavelSES
Новичок
*

Репутация: 0
Gender: Male
Posts: 12


281246672
View Profile
« Reply #12 on: 22 August 2007, 12:24 »

/echo $system.osversion
Windows Server 2003 "R2" Enterprise Edition Service Pack 2 (Build 3790)
Smiley
Logged

Maximusya
Глобальный модератор
*****

Репутация: 49
Gender: Male
Posts: 343



View Profile
« Reply #13 on: 23 August 2007, 12:27 »

Внес в скрипт анализ имени и версии операционной системы. Не в Windows откажется работать (но думаю, объединим наши с SiRuS-ом скрипты), а для win2k3 применит другой формат времени.

http://maximusya.at.tut.by/uptime.7z
Logged
noLove
Глобальный модератор
*****

Репутация: 17
Posts: 181



View Profile
« Reply #14 on: 10 September 2007, 13:15 »

Maximusya, в винде есть команда systeminfo. она и в винхп и в вин2003 одинаково работать должна. посмотри ее.

теперь собирайте ваши 2 мегаскрипта воедино Smiley
Logged

Pages: [1] 2
Print
Jump to:  

Theme orange-lt created by panic