Решено: Shell-скрипт. (Вычисление времени работы скрипта.)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
halo
Сообщения: 128
ОС: debian 4

Решено: Shell-скрипт.

Сообщение halo »

Всем привет. :)
На машине, где работать должен скрипт, нет способа вывести время в формате: "количество секунд с 00:00:00 1970". Это hp-ux.
Есть команды:
`date -u +%S`
`date -u +%m`

Время выполнения ряда команд составляет порядка 3-4 минут. Как вычислить время работы скрипта с такими условиями?

Вот примерный мой вариант:

Код:

ts1=`date -u +%S` tm1=`date -u +%m` # #some commands rownin' 'bout 3 min. # ts2=`date -u +%S` tm2=`date -u +%m` tm2-tm1 if ts2 < ts1; then C=60-ts1+ts2 else C=ts2-ts1 fi cat tm2-tm1 C


P.S. Это не рабочий кусок кода, а примерный мой алгоритм, который я восстановил по памяти.
If I could, I would fly.
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: Решено: Shell-скрипт.

Сообщение nesk »

может проще использовать команды time или timex ?
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
Аватара пользователя
halo
Сообщения: 128
ОС: debian 4

Re: Решено: Shell-скрипт.

Сообщение halo »

nesk писал(а):
25.09.2009 12:38
может проще использовать команды time или timex ?


Отличная идея!

Код:

func_x() { # # some commands running 3 min # } time func_x


Как перенаправить вывод строки real в файл?
If I could, I would fly.
Спасибо сказали:
MakkyWelly
Сообщения: 97
ОС: по обстоятельствам :)

Re: Решено: Shell-скрипт.

Сообщение MakkyWelly »

man time :))
Там даже на русском языке.

Код: Выделить всё

time -f %e -o time.txt func_x
# то же что
time --format=%e --output="time.txt" func_x
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4471
Статус: GNU generation
ОС: Debian GNU/Linux

Re: Решено: Shell-скрипт.

Сообщение Rootlexx »

Кстати, в BASH есть переменная SECONDS, содержащая время работы текущей оболочки в секундах. Так что достаточно будет взять значения этой переменной до и после выполнения этих долгих команд, а разность полученных значений как раз и будет временем их работы.
Спасибо сказали:
Аватара пользователя
halo
Сообщения: 128
ОС: debian 4

Re: Решено: Shell-скрипт.

Сообщение halo »

Не работает, что-то. :mellow:

Код:

greg@debian:~/Desktop$ cat test.sh func_x() { echo `date` sleep 1 echo `date` sleep 1 echo `date` sleep } time -f %e -o time.txt func_x greg@debian:~/Desktop$ ./test.sh ./test.sh: line 10: -f: команда не найдена real 0m0.003s user 0m0.000s sys 0m0.000s greg@debian:~/Desktop$


Чувствую себя блондинкой. =/
If I could, I would fly.
Спасибо сказали:
Аватара пользователя
halo
Сообщения: 128
ОС: debian 4

Re: Решено: Shell-скрипт.

Сообщение halo »

Сотый птсо!

Разобрался. Если кому интересно, сделал двумя файлами:
1. Непосредственно функция [/home/greg/Desktop/func_x]:

Код:

echo `date` sleep 1 echo `date` sleep 1 echo `date` sleep 1 echo "___________"

2. Скрипт вычисления времени работы функции [/home/grep/Desktop/statistics]:

Код:

/usr/bin/time -f %e -o r-period /home/greg/Desktop/func_x sleep 5 /bin/cat /home/greg/Desktop/r-period sleep 1 done
If I could, I would fly.
Спасибо сказали:
MakkyWelly
Сообщения: 97
ОС: по обстоятельствам :)

Re: Решено: Shell-скрипт.

Сообщение MakkyWelly »

а зачем вы указываете полные пути к time и cat?
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали:
Аватара пользователя
halo
Сообщения: 128
ОС: debian 4

Re: Решено: Shell-скрипт.

Сообщение halo »

Так мне посоветовали сделать:
time on its own executes the built-in shell command of that name, which doesn't take the options that the standalone program /usr/bin/time does. So use the full path to the time command in your script ... /usr/bin/time -f % etc....


Вся соль как раз у меня и была в том, чтобы запустить эту команду. :) Запустить ее получилось таким способом. :) Других вариантов я не смог придумать. :)
If I could, I would fly.
Спасибо сказали:
MakkyWelly
Сообщения: 97
ОС: по обстоятельствам :)

Re: Решено: Shell-скрипт.

Сообщение MakkyWelly »

Ну да, есть не GNU, а POSIX версия time, но её можно и снести и оставить только современную версию.

(halo) писал(а):Вся соль как раз у меня и была в том, чтобы запустить эту команду. :) Запустить ее получилось таким способом. :) Других вариантов я не смог придумать. :)


То есть?)) Когда вы пишите в shell, например, abrakadabra, он ищет программу с точно с таким названием в /bin, /usr/bin, и даже /usr/local/bin (!) :))

Код: Выделить всё

#!/bin/sh

if [ "$1" = "" ] || [ "$2" = "" ]
then
  echo "usage: ./time.sh output-file test-file"
  exit 1
else
  time -f %e -o $1 $2
  cat $1
fi
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: Решено: Shell-скрипт.

Сообщение nesk »

MakkyWelly писал(а):
27.09.2009 22:46
То есть?)) Когда вы пишите в shell, например, abrakadabra, он ищет программу с точно с таким названием в /bin, /usr/bin, и даже /usr/local/bin (!) smile.gif)

Ищет по путям перечисленным в переменной PATH слева направо до первого совпадения.
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
MakkyWelly
Сообщения: 97
ОС: по обстоятельствам :)

Re: Решено: Shell-скрипт.

Сообщение MakkyWelly »

nesk, это я и имел в виду. Разве что на машине PATH будет обнулена (или обнулена в к-н окружении), или нужная версия программы будет лежать "дальше" (например свеже-откомпилированная ляжет в /usr/local/bin, а стандартная будет в /bin) - тогда нужно прописывать полный путь.

hallo:

Код: Выделить всё

echo $PATH

всё исполнимые файлы, что есть в этих папках будут вызываться без полного пути.
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: Решено: Shell-скрипт.

Сообщение nesk »

MakkyWelly писал(а):
27.09.2009 22:55
nesk, это я и имел в виду. Разве что на машине PATH будет обнулена (или обнулена в к-н окружении), или нужная версия программы будет лежать "дальше" (например свеже-откомпилированная ляжет в /usr/local/bin, а стандартная будет в /bin) - тогда нужно прописывать полный путь.


Смотря кто будет запускать этот скрипт. Возможно это будет демон в среде которого PATH не определена. А возможно это будет пользователь, который поменяет у себя переменную PATH, так что бы вместо стандартных программ, выполнялись какие то левые. :crazy:

Но в обще это к основному вопросу темы не относиться. Писать полный путь к программе в скрипте - это наверно хороший тон.
Например некоторые линуксойды даже в командной строке вызывают команду sudo указывая полный путь /usr/bin/sudo
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
MakkyWelly
Сообщения: 97
ОС: по обстоятельствам :)

Re: Решено: Shell-скрипт.

Сообщение MakkyWelly »

(nesk) писал(а):Писать полный путь к программе в скрипте - это наверно хороший тон.


Посмотрел на Ъ скрипты - да, там полные пути. Как я понял, единственная причина для этого - безопастность.

По теме - если time всё-таки POSIX версии, то вариант выше не пойдёт. Почему-то не получается переправить результат time в файл, наверно потому что это не внешняя программа, а встроенная в shell команда:

Код: Выделить всё

time > 1
# 1 пустой
(time ls | tail -n 3 | head -n 1) > 1
# в 1 - только результаты ls
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Решено: Shell-скрипт.

Сообщение t.t »

MakkyWelly писал(а):
28.09.2009 00:12
По теме - если time всё-таки POSIX версии, то вариант выше не пойдёт. Почему-то не получается переправить результат time в файл, наверно потому что это не внешняя программа, а встроенная в shell команда:

Код: Выделить всё

time > 1
# 1 пустой
(time ls | tail -n 3 | head -n 1) > 1
# в 1 - только результаты ls
Не потому. time выводит в stderr, а не в stdout -- для того, чтобы её вывод не смешивался с выводом измеряемой команды. Т.е. надо так:

Код: Выделить всё

time команда 2>файл


MakkyWelly писал(а):
27.09.2009 22:46
Ну да, есть не GNU, а POSIX версия time, но её можно и снести и оставить только современную версию.
При чём здесь GNU и POSIX версии? Там ведь написано, что без пути вызывается встроенная команда shell. А GNU вообще не имеет отношения к теме: у автора HP-UX (см. первый пост).
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
MakkyWelly
Сообщения: 97
ОС: по обстоятельствам :)

Re: Решено: Shell-скрипт.

Сообщение MakkyWelly »

(t.t) писал(а):При чём здесь GNU и POSIX версии?

На MinGW вроде бы POSIX версия и там нет ключей -f и -o (у меня по крайней мере нет).

Поэтому вот другой вариант:

Код: Выделить всё

#!/bin/sh

if [ "$1" = "" ] || [ "$2" = "" ]
then
  echo "usage: ./time.sh output-file test-file"
  exit 1
else
  time -p $2 2>/tmp/1; head -n 1 /tmp/1 > $1
  cat $1
fi


(nesk) писал(а):Например некоторые линуксойды даже в командной строке вызывают команду sudo указывая полный путь /usr/bin/sudo

А если `alias sudo='/usr/bin/sudo'` в .bashrc ?)
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали:
Аватара пользователя
halo
Сообщения: 128
ОС: debian 4

Re: Решено: Shell-скрипт.

Сообщение halo »

В чем проблема? Под hp-ux не хочет работать. Под linux работает нормально. :)
Читать пытаюсь man time в hp-ux. Там описан только параметр "-p". Вообще все как-то куцо.
Сломал весь мозг. Задача вроде проста.
Пишу что-то вроде:
echo "`/usr/bin/time /home/some_folder/damn_func_x`" > /home/some_folder/some_period

Вместо задуманной мной записи в файл он выкидывает данные в терминал. Что за хрееееень? =\

upd. Качаю сейчас FreeBSD, может под ней что-то hp-ux-подобное будет.
If I could, I would fly.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Решено: Shell-скрипт.

Сообщение drBatty »

MakkyWelly писал(а):
29.09.2009 23:04
А если `alias sudo='/usr/bin/sudo'` в .bashrc ?)

алиасы в скриптах не работают.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
halo
Сообщения: 128
ОС: debian 4

Re: Решено: Shell-скрипт.

Сообщение halo »

Все. Разобрался. Руки кривые. Закрывайте.
If I could, I would fly.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Решено: Shell-скрипт.

Сообщение t.t »

MakkyWelly писал(а):
29.09.2009 23:04
(t.t) писал(а):При чём здесь GNU и POSIX версии?
На MinGW вроде бы POSIX версия и там нет ключей -f и -o (у меня по крайней мере нет).
А MinGW-то здесь при чём? Вы понимаете, что такое встроенная команда оболочки? И если у POSIX-версии команды time нет определённых ключей, это вовсе не означает, что всё, у чего их нет, суть POSIX-версии. Насколько я помню HP-UX, встроенная в тамошнюю оболочку команда time стандарту не вполне соответствует. Но суть не в этом, а в том, что встроенную команду физически невозможно, как Вы говорите, "снести". И что "шпуксовая" внешняя команда time не имеет никакого отношения к GNU -- это уж вне всяких сомнений.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
MakkyWelly
Сообщения: 97
ОС: по обстоятельствам :)

Re: Решено: Shell-скрипт.

Сообщение MakkyWelly »

(t.t) писал(а):И если у POSIX-версии команды time нет определённых ключей, это вовсе не означает, что всё, у чего их нет, суть POSIX-версии.

Понятно, просто перепутал достаточное и необходимое условие, как говорится.

drBatty, это nesk писал, что кто-то набирает в оболочке полный путь к sudo, чтобы обезопасить себя. Разве не проще сделать такой alias (sudo через sudo)?
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: Решено: Shell-скрипт.

Сообщение nesk »

MakkyWelly писал(а):
01.10.2009 22:13
drBatty, это nesk писал, что кто-то набирает в оболочке полный путь к sudo, чтобы обезопасить себя. Разве не проще сделать такой alias (sudo через sudo)?

alias и подделать можно. :)
Так же как и PATH
Вы пишете sudo - срабатывает алиас, который вызывает левую команду.
UPD вот тут Почему вы против продвижения Линукс в широких массах?
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
MakkyWelly
Сообщения: 97
ОС: по обстоятельствам :)

Re: Решено: Shell-скрипт.

Сообщение MakkyWelly »

Как подделать alias рута если он прописан в .bashrc, права на который имеет только рут?
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Решено: Shell-скрипт.

Сообщение drBatty »

MakkyWelly писал(а):
01.10.2009 22:13
Разве не проще сделать такой alias (sudo через sudo)?

nesk писал(а):
01.10.2009 23:42
alias и подделать можно. smile.gif
Так же как и PATH

блин, вот потому я и писал всегда - убунта - УГ.
MakkyWelly писал(а):
01.10.2009 23:45
Как подделать alias рута если он прописан в .bashrc, права на который имеет только рут?

наверное имелось ввиду беспарольное sudo от юзера.
кстати, алиас рута нет смысла подделывать - у алиасов нет хозяев. и всегда работает unalias. т.е. рут может как-то сделать юзеру алиас (например покрутить /etc/profile), да только юзер его сможет изменить. На самом деле - алиасы это "переменные" оболочки, и выходя из оболочки мы их теряем...

Т.ч. рутовым алиасом из рутового /root/.bashrc может пользоваться только рут. и подделать его может только рут.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: