LinuxForum.Fans
Тема

cron: как запускать скрипт раз в минуту?

Автор: baron_P 22 сообщений 4678 просмотров
#359876

Вопрос немного с подвохом. В интернете есть примеры этого дела. Но у меня до запуска собственно скрипта дело не доходит - мой cron вообще отказывает что-либо делать по расписанию
Вот пример из хелпа убунтушного:
[console]SHELL=/bin/bash
MAILTO=username
0 * * * * scrot[/console]
Он делает снимок экрана раз в час, судя по описанию.
Я хочу тоже самое, но раз в минуту. Через [console]sudo crontab -u baron_p -e[/console] записываю:
[console]SHELL=/bin/bash
MAILTO=""
* * * * * scrot[/console]
По [console]crontab -l[/console] задание есть. Утилита scrot при ручном запуске из консоли работает. top показывает запущенный cron в списке. А снимки в домашней папке не появляются. Почему так?

#359889

как минимум, ему нужна переменная DISPLAY. Возможно, хоть и вряд ли, понадобится ещё id сессии dbus'а...

#359914

М.б. ошибаюсь, а не так: $ * /1 * * * * export DISPLAY=:0 - ну, что бы через 1 минуту? :[

#359983
baron_P написал:
Вопрос немного с подвохом. В интернете есть примеры этого дела. Но у меня до запуска собственно скрипта дело не доходит - мой cron вообще отказывает что-либо делать по расписанию
Вот пример из хелпа убунтушного:
[console]SHELL=/bin/bash
MAILTO=username
0 * * * * scrot[/console]
Он делает снимок экрана раз в час, судя по описанию.
Я хочу тоже самое, но раз в минуту. Через [console]sudo crontab -u baron_p -e[/console] записываю:
[console]SHELL=/bin/bash
MAILTO=""
* * * * * scrot[/console]
По [console]crontab -l[/console] задание есть. Утилита scrot при ручном запуске из консоли работает. top показывает запущенный cron в списке. А снимки в домашней папке не появляются. Почему так?

А путь к scrot где прописан? Можете проверить, в cron поставьте вывод $PATH в файл.

#360071

по crontab информации много и примеры есть в изобилии, причем самые изощренные.
http://ru.wikipedia.org/wiki/Cron

если запуск каждую минуту то должно быть в виде
0-59 * * * * путь к файлу

если запускать каждую минуту с 10 до 23 то
0-59 10-23 * * * путь к файлу

а 0 * * * * - это не запускать никогда вроде бы как :)

#360079
"blackcat" написал:
если запуск каждую минуту то должно быть в виде
0-59 * * * * путь к файлу

"Многабукафф" :) Для запуска раз в минуту достаточно такой строки:

text
* * * * * путь к файлу
"blackcat" написал:
а 0 * * * *   - это не запускать никогда вроде бы как  :)

Совсем не так. Это означает "запускать в 00 минут каждого часа".

#360164

Спасибо. Но пока лучше не стало. Вот так не работает:
[console]SHELL=/bin/bash
MAILTO=""
PATH=/usr/bin
* * * * * export DISPLAY=:0 scrot > /home/baron_p/c_log[/console]
Лог создается, но пустой.
Проблема не в недостатке примеров и их изощеренности, а в том, что самый простой не работает. А информация какая-то противоречивая. Найти, что значит export DISPLAY=:0 я не смог сходу. Крону дается задача принтскринить диплей №0? А зачем тут export?

#360181

export нужен, что бы xterm не выдавал ошибку. Но, почитав о scrot я заметил такую штуку: в пути надо указать название файла. Например:
*/1 * * * * DISPLAY=:0 scrot > /home/baron_p/c_log/scrot.png Тогда через каждую минуту в папке c_log будет появляться файл scrot**.png Возможно ошибаюсь.

#360191
"Oleg65" написал:
Возможно ошибаюсь.

Все верно только

text
*/1 * * * * DISPLAY=:0 scrot  home/baron_p/c_log/scrot.png
#360641

Спасибо. Вот так работает:
[console]SHELL=/bin/bash
MAILTO=""
PATH=/usr/bin
* * * * * DISPLAY=:0 scrot /home/baron_p/log/scrot.png[/console]
Только в папке появляется один файл scrot.png, который раз в минуту перезаписывается заново. Но это уже мелочи.

Ради чего это затевалось: хочу запускать вот такой скрипт (отсюда http://www.bsdportal.ru/viewtopic.php?t=18899) раз в минуту:
[console]#!/bin/sh
stat=$(upsc ippon700 ups.status)
zarad=$(upsc ippon700 battery.charge)
zarad=$(echo $zarad/1|bc)
if [ "$stat" = "OB" ]
then
if [ $zarad -le 42 ]
then
shutdown -Ph +0
fi
fi
exit 0[/console]
Скрипт смотрит за зарядом батареи ИБП (battery.charge), когда напряжения в розетке нет (ups.status OB), и отрубает при 42 % заряда. Завтра буду ковыряться, скорее всего будут еще вопросы:-)

#360678
"baron_P" написал:
Скрипт смотрит за зарядом батареи ИБП (battery.charge), когда напряжения в розетке нет (ups.status OB), и отрубает при 42 % заряда. Завтра буду ковыряться, скорее всего будут еще вопросы:-)

зачем изобретать велосипед? Вот: https://wiki.archlinux.org/index.php/Laptop_Mode_Tools_%28%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9%29

(к другим системам тоже есть, даже к слаке)

"Alexey_1" написал:
sudo crontab -u baron_p -e
не надо так делать. Надо войти в юзера, и уже там запускать crontab. Ну или на край sudo -u baron crontab -e (если команда с перенаправлением, то кавычки нужны).
#360679
"baron_P" написал:
[ $zarad -le 42 ]

да не занимайтес вы ерундой, всё проще:

text
if (( $zarad <= 42 )); then
"baron_P" написал:
shutdown -Ph +0

тут уместно спросить юзера, а то может он чем-то важным занят.

#361398

Не пашет. Лог пустой создает, но на проценты батареи не реагирует.
Скипт /etc/upsdown.sh:
[console]#!/bin/sh
stat=$(upsc ippon700 ups.status)
zarad=$(upsc ippon700 battery.charge)
zarad=$(echo $zarad/1|bc)
if [ "$stat" = "OB" ]
then
if (( $zarad <= 42 ))
then
shutdown -Ph +0
fi
fi
exit 0[/console]
Крон:
[console]MAILTO=""
SHELL=/bin/bash
PATH=/bin:/sbin:/usr/sbin:/usr/bin
* * * * * DISPLAY=:0 /etc/upsdown.sh 2 > /home/baron_p/log[/console]
На неделе подумаю, как бы какие-нить сообщения от скрипта поиметь в процессе выполнения/невыполения. Если время будет, нема его сейчас.

Юзер важным не занят, это для домашнего компа скрип:-)
Почему лучше crontab из под юзера запускать?
Про невелосипед прочитал, но, по-моему, метод со скриптом проще и нагляднее.

#361419
"baron_P" написал:
* * * * * DISPLAY=:0 /etc/upsdown.sh 2 > /home/baron_p/log

Простите, а для чего вам вот эта цифра "2" в строке запуска? Если это параметр, передаваемый скрипту, то в самом скрипте я не обнаружил ни намека на принимаемые аргументы. А если это означает, что в лог перенаправляется STDERR, то нужно убрать пробел между "2" и ">":

text
* * * * * DISPLAY=:0 /etc/upsdown.sh 2> /home/baron_p/log
#362297

Спасибо, пробел там действительно был лишним.
Сначала в лог вывелся премишн денид, а после chmod 755 на скрипт, получил вот такое в логе при питании от батареи:
[console]/etc/upsdown.sh: 7: /etc/upsdown.sh: cannot open =: No such file
/etc/upsdown.sh: 7: /etc/upsdown.sh: 50: not found[/console]
Похоже на ошибку в 7-й строчке скрипта. Исправил (( $zarad <= 42 )) на [ $zarad -le 42 ]. Ошибок в логе больше нет, но питание при менее чем 42 процентах не отрубает.
Закаментил строчку zarad=$(echo $zarad/1|bc) (не понял, что она делает и зачем она тут), и в логе появилось запись про "недостаточно прав на запуск shutdown". Теперь вопрос в том, как скрипту дать права на запуск этой команды?

#362403
"baron_P" написал:
Исправил (( $zarad <= 42 )) на [ $zarad -le 42 ].

Логично, так как конструкция, предложенная drBatty, работает в bash, а ваш скрипт исполняется с помощью sh.

"baron_P" написал:
Закаментил строчку zarad=$(echo $zarad/1|bc) (не понял, что она делает и зачем она тут)

А вы попробуйте вставить после этой и предшествующей ей строки вот это:

text

echo "$zarad"

Потом запустите скрипт вручную и посмотрите, что будет выведено в консоль. Это поможет понять, какие изменения претерпевает данная переменная.

#363954

Слоупочу - комп был занят сутками, не до баловства с ИБП было.
Скрипт изменил так:
[console]#!/bin/sh
stat=$(upsc ippon700 ups.status)
zarad=$(upsc ippon700 battery.charge)
echo "$zarad"
zarad=$(echo $zarad/1|bc)
echo "$zarad"
if [ "$stat" = "OB" ]
then
echo "battary"
if [ $zarad -le 42 ]
then
echo "<42%"
shutdown -Ph +0
fi
fi
exit 0[/console]
В кроне сделал так:
[console]MAILTO=""
SHELL=/bin/bash
PATH=/bin:/sbin:/usr/sbin:/usr/bin
* * * * * DISPLAY=:0 /etc/upsdown.sh > /home/baron_p/log1 2> /home/baron_p/log[/console]

В итоге (при работе от батареи) получаю такое:

log:
shutdown: Необходимо быть суперпользователем

log1:
37
37
battary
<42%

Т.е. что тут делает строка zarad=$(echo $zarad/1|bc) одному Ктулху известно. Да и не важно, раз без нее пашет. Осталось нагуглить, как скрипту права дать :)

#363956

Ужас какой.
При правильной настройке nut параметр -

text
override.battery.charge.low = 42

в /etc/nut/ups.conf, делает весь этот изврат.
ы. Хотя, ... UPS может и не воспринять эту команду.
Но! В любом случае зачем это нужно? Если вы боитесь за аккумулятор, то не стоит, показания которые сообщает UPS об уровне разряда не те, что на самом деле, в прошивке любого UPS зашита защита от глубокого разряда аккумулятора (можно сказать, что сообщая о полном разряде на самом деле в UPS остаётся еще ~30% заряда), так что всё это ни к чему.

#363978

В интернетах я не нашел, как так можно nut настроить, чтоб он на override.battery.charge.low в /etc/nut/ups.conf реагировал. При любых значениях этого параметра nut отрубает комп только когда ups выдает сообщение о полном разряде. А проблема в том, что между этим сообщением (началом отключения компа) и отключением ups, проходит слишком мало времени (мала емкость аккумулятора) и комп не успевает корректно выключиться.

#363995

Так с этого начинать и надо было, есть параметры offdelay и ondelay в /etc/nut/ups.conf:
Пример:

text
[SMK]
   # http://www.networkupstools.org/docs/man/blazer.html#_battery_charge
   driver = blazer_ser
   port = /dev/ttyS0

# Time to wait before shutting down the UPS (seconds). This value is truncated to units of 6 seconds # (less than 60 seconds) or 60 seconds (more than 60 seconds). Defaults to 30 seconds. # Задержка после получения упсом сигнала shutdown, в сек offdelay = 60

# Задержка после выключения упса в минутах! # Time to wait before switching on the UPS (minutes). Note that a value below 3 minutes, # may cause earlier firmware versions to not switch on automatically, so it defaults to 3 minutes. ondelay = 0

А смотреть надо тут http://www.networkupstools.org/docs/man/

Войдите или зарегистрируйтесь, чтобы ответить.