Работа со временем в bash.
Модераторы: /dev/random, Модераторы разделов
-
Yaros
- Сообщения: 501
- ОС: Debian Wheezy / Gentoo
Работа со временем в bash.
Возникла потребность создать скрипт, в котором определенное действие будет происходить через 3 минуты после того, как выполнится другое.
Так же нужно узнать выполнилось ли то действие (есть команда, возвращающая false в случае выполнения, и true - если еще не выполнено). Для этого подумывал сделать цикл, раз в неск. секунд делающий запрос. Интересно можно ли сделать такой цикл и не сильно ли он загрузит систему.
Хотелось бы услышать совет, как сделать подобное или хотя бы пинок в сторону нормального мана на русском (именно по времени).
Так же нужно узнать выполнилось ли то действие (есть команда, возвращающая false в случае выполнения, и true - если еще не выполнено). Для этого подумывал сделать цикл, раз в неск. секунд делающий запрос. Интересно можно ли сделать такой цикл и не сильно ли он загрузит систему.
Хотелось бы услышать совет, как сделать подобное или хотя бы пинок в сторону нормального мана на русском (именно по времени).
-
Yaros
- Сообщения: 501
- ОС: Debian Wheezy / Gentoo
Re: Работа со временем в bash.
Разобрался с этой частью вопроса: screen подходит идеально... Остался цикл.
-
SLEDopit
- Модератор
- Сообщения: 4824
- Статус: фанат консоли (=
- ОС: GNU/Debian, RHEL
Re: Работа со временем в bash.
я чего-то не понимаю или
Код: Выделить всё
command1 && sleep 3m && command2или там еще что-то должно происходить параллельно?
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
The more you believe you don't do mistakes, the more bugs are in your code.
-
vr13
- Сообщения: 885
- ОС: gentoo
Re: Работа со временем в bash.
чтобы не циклить и не грузить систему, нужно спать (sleep) и "действия" - выполнять асинхронно и дожидаться завершения - см wait, waitpid. асинхронность еще можно реализовать через внешнюю команду - at. вариантов, как обычно в *nix - не один, кроме названных скорее всего можно еще чего-нить придумать. screen к этому наверное тоже можно приспособить, но я не могу придумать как )
-
SLEDopit
- Модератор
- Сообщения: 4824
- Статус: фанат консоли (=
- ОС: GNU/Debian, RHEL
Re: Работа со временем в bash.
Код: Выделить всё
screen -S temp sleep 3mUNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
The more you believe you don't do mistakes, the more bugs are in your code.
-
Yaros
- Сообщения: 501
- ОС: Debian Wheezy / Gentoo
Re: Работа со временем в bash.
SLEDopit писал(а): ↑03.11.2009 18:57я чего-то не понимаю илинынче не в моде?Код: Выделить всё
command1 && sleep 3m && command2
или там еще что-то должно происходить параллельно?
Я в предыдущем комменте уже написал:
Разобрался с этой частью вопроса: screen подходит идеально.
Я просто со sleep'ом не был знаком
Блин, очепятался! Конечно же sleep!
Кстати, попутно решил вторую часть вопроса: можно сделать цикл, и, если результат равен true, делаем "sleep 3s" и повторяем цикл. Если же false, делаем "command1 && sleep 3m && command2".
Интересно только, не сильно ли подобные скрипты будут тормозит работу при запущеных "тяжелых" приложениях.
-
SLEDopit
- Модератор
- Сообщения: 4824
- Статус: фанат консоли (=
- ОС: GNU/Debian, RHEL
Re: Работа со временем в bash.
зачем цикл?
в конструкции
Код: Выделить всё
command1 && sleep 3m && command2если все хорошо - управление передается следующей команде, если нет, то все завершается.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
The more you believe you don't do mistakes, the more bugs are in your code.
-
Yaros
- Сообщения: 501
- ОС: Debian Wheezy / Gentoo
Re: Работа со временем в bash.
SLEDopit писал(а): ↑03.11.2009 19:34зачем цикл?
в конструкции&& уже проверяет успешность завершения предыдущей команды после ее завершения.Код: Выделить всё
command1 && sleep 3m && command2
если все хорошо - управление передается следующей команде, если нет, то все завершается.
Вы неправильно поняли.Чтобы выполнить "command1 && sleep 3m && command2", нужно в цикле получить определенное значение. Цикл должен выполняться каждые n секунд до получения значения false. После получения этого значения выполняется "command1 && sleep 3m && command2",
-
SLEDopit
- Модератор
- Сообщения: 4824
- Статус: фанат консоли (=
- ОС: GNU/Debian, RHEL
Re: Работа со временем в bash.
а, ну тогда это будет выглядеть вот так:
зачем второй цикл то?
Код: Выделить всё
i=0;while [ $i -eq 0 ]; do command || i=1; done
command1 && sleep 3m && command2UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
The more you believe you don't do mistakes, the more bugs are in your code.
-
Yaros
- Сообщения: 501
- ОС: Debian Wheezy / Gentoo
Re: Работа со временем в bash.
SLEDopit писал(а): ↑03.11.2009 20:22а, ну тогда это будет выглядеть вот так:
зачем второй цикл то?Код: Выделить всё
i=0;while [ $i -eq 0 ]; do command || i=1; done command1 && sleep 3m && command2
Там один цикл
-
SLEDopit
- Модератор
- Сообщения: 4824
- Статус: фанат консоли (=
- ОС: GNU/Debian, RHEL
Re: Работа со временем в bash.
может еще мой затуманенный бессонными ночами разум сбоит =)
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
The more you believe you don't do mistakes, the more bugs are in your code.
-
t.t
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
Re: Работа со временем в bash.
А зачем переменная?SLEDopit писал(а): ↑03.11.2009 20:22а, ну тогда это будет выглядеть вот так:
зачем второй цикл то?Код: Выделить всё
i=0;while [ $i -eq 0 ]; do command || i=1; done command1 && sleep 3m && command2
Код: Выделить всё
while command; do :; doneТогда немного не так, но тоже всё просто:
Код: Выделить всё
while command; do sleep 3; doneПодозреваю, что у Вас подействовал распространённый шаблон: воспринимать while [ ... ] как одну конструкцию. На самом же деле условием в цикле while выступает любая команда (точнее, код её завершения). И [ -- это тоже команда:t.t писал(а): ↑04.11.2009 14:59А зачем переменная?SLEDopit писал(а): ↑03.11.2009 20:22а, ну тогда это будет выглядеть вот так:
зачем второй цикл то?Код: Выделить всё
i=0;while [ $i -eq 0 ]; do command || i=1; done command1 && sleep 3m && command2
Код: Выделить всё
while command; do :; done
Код: Выделить всё
t:~$ which [
/usr/bin/[¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
-
Yaros
- Сообщения: 501
- ОС: Debian Wheezy / Gentoo
Re: Работа со временем в bash.
t.t писал(а): ↑04.11.2009 14:59Тогда немного не так, но тоже всё просто:
Код: Выделить всё
while command; do sleep 3; done
Код:
function check_playing {
$(dcop amarok player isPlaying)
}
while [[ $(check_playing) = true ]]; do
sleep 10
done
echo Rule!Суть в том, что если функция check_playing возвращает true, нужно "уснуть" на 10 секунд, а затем проверить еще раз условие. Когда условие станет false, нужно сотворить какое-то действие (в этом примере - "echo Rule!")
t.t писал(а): ↑04.11.2009 14:59А зачем переменная?SLEDopit писал(а): ↑03.11.2009 20:22а, ну тогда это будет выглядеть вот так:
зачем второй цикл то?Код: Выделить всё
i=0;while [ $i -eq 0 ]; do command || i=1; done command1 && sleep 3m && command2
Код: Выделить всё
while command; do :; done
Ойк... не вкурил. Оно выполняется, пока команда возвращает ненулевое значение?
-
BIgAndy
- Сообщения: 1923
Re: Работа со временем в bash.
man cron
и man bash на предмет амперсандов & и &&
Так же нужно узнать выполнилось ли то действие
Парсим логи или выставляем флаги. зависит от собственной одаренности.
Интересно можно ли сделать такой цикл и не сильно ли он загрузит систему.
Хотелось бы услышать совет, как сделать подобное или хотя бы пинок в сторону нормального мана на русском (именно по времени).
Можно, но зачем костыли, когда есть штаное проверенное десятилетиями решение.?
-
t.t
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
Re: Работа со временем в bash.
Функции в bash (как и команды) не возвращают true, они возвращают числовые значения, коды ошибок. Код успешного завершения -- 0. Цикл, написанный мною выше, именно это и делает: пока команда выполняется успешно, ждёт по 3 секунды и проверяет заново; а как только команда завершится с ошибкой, управление пойдёт дальше.Yaros писал(а): ↑05.11.2009 17:33t.t писал(а): ↑04.11.2009 14:59Тогда немного не так, но тоже всё просто:
Код: Выделить всё
while command; do sleep 3; done
Код:
function check_playing { $(dcop amarok player isPlaying) } while [[ $(check_playing) = true ]]; do sleep 10 done echo Rule!
Суть в том, что если функция check_playing возвращает true, нужно "уснуть" на 10 секунд, а затем проверить еще раз условие. Когда условие станет false, нужно сотворить какое-то действие (в этом примере - "echo Rule!")
Пока возвращает нулевое, т.е. пока выполняется успешно. В shell возвращаемые значения в этом смысле "наоборот" по сравнению с процедурными языками, но на практике так удобнее: кодов ошибок может быть несколько, а успешное завершение -- оно всегда одинаковое.Yaros писал(а): ↑05.11.2009 17:33Ойк... не вкурил. Оно выполняется, пока команда возвращает ненулевое значение?t.t писал(а): ↑04.11.2009 14:59А зачем переменная?SLEDopit писал(а): ↑03.11.2009 20:22а, ну тогда это будет выглядеть вот так:
зачем второй цикл то?Код: Выделить всё
i=0;while [ $i -eq 0 ]; do command || i=1; done command1 && sleep 3m && command2
Код: Выделить всё
while command; do :; done
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
-
t.t
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
Re: Работа со временем в bash.
Штатные, провереные десятилетиями решения хорошо использовать к месту. Как Вы предлагаете применять крон для запуска не _в_ конкретное время, а _через_ столько-то минут после выполнения другой команды? Тут at ещё как-то можно прикрутить, но и то со sleep проще. А уж cron-то тут при чём?BIgAndy писал(а): ↑05.11.2009 20:12man cron
и man bash на предмет амперсандов & и &&
Парсим логи или выставляем флаги. зависит от собственной одаренности.Так же нужно узнать выполнилось ли то действие
Можно, но зачем костыли, когда есть штаное проверенное десятилетиями решение.?Интересно можно ли сделать такой цикл и не сильно ли он загрузит систему.
Хотелось бы услышать совет, как сделать подобное или хотя бы пинок в сторону нормального мана на русском (именно по времени).
А предложение парсить логи (которых может и не быть) или выставлять какие-то флаги для проверки успешности завершения некой команды -- это как раз игнорирование "штатных, проверенных десятилетиями решений": ||, &&, if, while.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
-
Yaros
- Сообщения: 501
- ОС: Debian Wheezy / Gentoo
Re: Работа со временем в bash.
t.t писал(а): ↑06.11.2009 11:25Функции в bash (как и команды) не возвращают true, они возвращают числовые значения, коды ошибок. Код успешного завершения -- 0. Цикл, написанный мною выше, именно это и делает: пока команда выполняется успешно, ждёт по 3 секунды и проверяет заново; а как только команда завершится с ошибкой, управление пойдёт дальше.
А как тогда проверить на true/false? Писать в переменную результат $(dcop amarok player isPlaying), а затем сравнивать как строку?
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Работа со временем в bash.
так и проверять:
Код: Выделить всё
if command; then
echo "TRUE!"
else
echo "FALSE"
fiКроме того, можно проанализировать код ошибки, он в $?
-
BIgAndy
- Сообщения: 1923
Re: Работа со временем в bash.
t.t писал(а): ↑06.11.2009 11:32Штатные, провереные десятилетиями решения хорошо использовать к месту. Как Вы предлагаете применять крон для запуска не _в_ конкретное время, а _через_ столько-то минут после выполнения другой команды? Тут at ещё как-то можно прикрутить, но и то со sleep проще. А уж cron-то тут при чём?
Я же написал "man cron"
In other case cron checks each minute to see if its crontables modtime have changes and reload those which have changes.
А предложение парсить логи (которых может и не быть) или выставлять какие-то флаги для проверки успешности завершения некой команды -- это как раз игнорирование "штатных, проверенных десятилетиями решений": ||, &&, if, while.
Совершенно верно. АКА костыль.
Но если нужен более глубоккий анализ условий завершения, без анализа stdout не обойтись.
-
t.t
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
Re: Работа со временем в bash.
И что? Я знаю, что и через крон это _можно_ сделать (вообще, unix тем и хорош, что любую задачу позволяет сделать большим количеством разных методов). Вопрос в том, _нужно_ ли? Решение с помощью крона в данном случае будет сложнее, чем использование sleep, а какие плюсы от него _в данном случае_?BIgAndy писал(а): ↑07.11.2009 11:29Я же написал "man cron"t.t писал(а): ↑06.11.2009 11:32Штатные, провереные десятилетиями решения хорошо использовать к месту. Как Вы предлагаете применять крон для запуска не _в_ конкретное время, а _через_ столько-то минут после выполнения другой команды? Тут at ещё как-то можно прикрутить, но и то со sleep проще. А уж cron-то тут при чём?
In other case cron checks each minute to see if its crontables modtime have changes and reload those which have changes.
Если нужен -- тогда конечно. Но автор темы никак не дал понять, что он ему нужен.BIgAndy писал(а): ↑07.11.2009 11:29Совершенно верно. АКА костыль.А предложение парсить логи (которых может и не быть) или выставлять какие-то флаги для проверки успешности завершения некой команды -- это как раз игнорирование "штатных, проверенных десятилетиями решений": ||, &&, if, while.
Но если нужен более глубоккий анализ условий завершения, без анализа stdout не обойтись.
Одним словом, мне кажется, что Вы изобретаете сложности на ровном месте.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
-
BIgAndy
- Сообщения: 1923
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Работа со временем в bash.
иногда - нужно. например, если действия выполняются одним и тем-же скриптом - его можно тогда вызывать по crond каждые 3 минуты, а уж сам скрипт будет решать что нужно делать. Существенный плюс: этот скрипт не будет постоянно висеть в памяти. Хотя конечно случай редкий (однако я на практике примерно так делал).
для анализа stdout прелестно подходит sed:
sed 's/.*/command/ep;<а тут мы анализируем вывод>'
Впрочем нужно это редко. Преимущества перед решением на bash:
1) в bash плохо реализованы регулярные выражения.
2) sed быстрее.
t.t, это только замечания, в целом вы безусловно правы.
-
t.t
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
Re: Работа со временем в bash.
В качестве замечаний -- полностью согласен. Я лишь пытаюсь предостеречь, в том числе и автора темы, от достаточно распространённой ошибки: избирать самый надёжный или самый функциональный путь даже когда он явно избыточен, и достаточно будет простого и незатейливого. Тем самым стремясь к экономии времени автоматизацией задач, можно получить лишние затраты на саму автоматизацию.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж