1

Вопрос немного с подвохом. В интернете есть примеры этого дела. Но у меня до запуска собственно скрипта дело не доходит - мой cron вообще отказывает что-либо делать по расписанию
Вот пример из хелпа убунтушного:

 Консоль:
SHELL=/bin/bash
MAILTO=username
0 * * * * scrot

Он делает снимок экрана раз в час, судя по описанию.
Я хочу тоже самое, но раз в минуту. Через
 Консоль:
sudo crontab -u baron_p -e
записываю:
 Консоль:
SHELL=/bin/bash
MAILTO=""
* * * * * scrot

По
 Консоль:
crontab -l
задание есть. Утилита scrot при ручном запуске из консоли работает. top показывает запущенный cron  в списке. А снимки в домашней папке не появляются. Почему так?

Lubuntu 13.10 х86_64
Ubuntu 14.04 x86_64

2

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

95% процентов проблем находятся между клавиатурой и стулом.

3 (12.01.2014 20:34:09 отредактировано Oleg65)

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

4

baron_P пишет:

Вопрос немного с подвохом. В интернете есть примеры этого дела. Но у меня до запуска собственно скрипта дело не доходит - мой cron вообще отказывает что-либо делать по расписанию
Вот пример из хелпа убунтушного:

 Консоль:
SHELL=/bin/bash
MAILTO=username
0 * * * * scrot

Он делает снимок экрана раз в час, судя по описанию.
Я хочу тоже самое, но раз в минуту. Через
 Консоль:
sudo crontab -u baron_p -e
записываю:
 Консоль:
SHELL=/bin/bash
MAILTO=""
* * * * * scrot

По
 Консоль:
crontab -l
задание есть. Утилита scrot при ручном запуске из консоли работает. top показывает запущенный cron  в списке. А снимки в домашней папке не появляются. Почему так?

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

5 (13.01.2014 14:22:33 отредактировано blackcat)

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

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

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

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

Zen Inside

6 (13.01.2014 14:40:30 отредактировано allez)

blackcat пишет:

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

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

* * * * * путь к файлу

blackcat пишет:

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

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

7

Спасибо. Но пока лучше не стало.  Вот так не работает:

 Консоль:
SHELL=/bin/bash
MAILTO=""
PATH=/usr/bin
* * * * * export DISPLAY=:0 scrot > /home/baron_p/c_log

Лог создается, но пустой.
Проблема не в недостатке примеров и их изощеренности, а в том, что самый простой не работает. А информация какая-то противоречивая. Найти, что значит export DISPLAY=:0 я не смог сходу. Крону дается задача принтскринить диплей №0? А зачем тут export?

Lubuntu 13.10 х86_64
Ubuntu 14.04 x86_64

8 (13.01.2014 23:32:12 отредактировано Oleg65)

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

9

Oleg65 пишет:

Возможно ошибаюсь.

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

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

10

Спасибо. Вот так работает:

 Консоль:
SHELL=/bin/bash
MAILTO=""
PATH=/usr/bin
* * * * * DISPLAY=:0 scrot /home/baron_p/log/scrot.png

Только в папке появляется один файл scrot.png, который раз в минуту перезаписывается заново. Но это уже мелочи.

Ради чего это затевалось: хочу запускать вот такой скрипт (отсюда http://www.bsdportal.ru/viewtopic.php?t=18899) раз в минуту:

 Консоль:
#!/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

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

Lubuntu 13.10 х86_64
Ubuntu 14.04 x86_64

11

baron_P пишет:

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

зачем изобретать велосипед? Вот: https://wiki.archlinux.org/index.php/La … 8%D0%B9%29

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

Alexey_1 пишет:

sudo crontab -u baron_p -e

не надо так делать. Надо войти в юзера, и уже там запускать crontab. Ну или на край sudo -u baron crontab -e (если команда с перенаправлением, то кавычки нужны).

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

12

baron_P пишет:

[ $zarad -le 42 ]

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

if (( $zarad <= 42 )); then
baron_P пишет:

shutdown -Ph +0

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

13

Не пашет. Лог пустой создает, но на проценты батареи не реагирует.
Скипт /etc/upsdown.sh:

 Консоль:
#!/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

Крон:
 Консоль:
MAILTO=""
SHELL=/bin/bash
PATH=/bin:/sbin:/usr/sbin:/usr/bin
* * * * * DISPLAY=:0 /etc/upsdown.sh 2 > /home/baron_p/log

На неделе подумаю, как бы какие-нить сообщения от скрипта поиметь в процессе выполнения/невыполения. Если время будет, нема его сейчас.

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

Lubuntu 13.10 х86_64
Ubuntu 14.04 x86_64

14 (20.01.2014 10:17:28 отредактировано allez)

baron_P пишет:

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

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

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

15 (24.01.2014 22:54:56 отредактировано baron_P)

Спасибо, пробел там действительно был лишним.
Сначала в лог вывелся премишн денид, а после chmod 755 на скрипт, получил вот такое в логе при питании от батареи:

 Консоль:
/etc/upsdown.sh: 7: /etc/upsdown.sh: cannot open =: No such file
/etc/upsdown.sh: 7: /etc/upsdown.sh: 50: not found

Похоже на ошибку в 7-й строчке скрипта. Исправил (( $zarad <= 42 )) на [ $zarad -le 42 ]. Ошибок в логе больше нет, но питание при менее чем 42 процентах не отрубает.
Закаментил строчку zarad=$(echo $zarad/1|bc) (не понял, что она делает и зачем она тут), и в логе появилось запись про "недостаточно прав на запуск shutdown". Теперь вопрос в том, как скрипту дать права на запуск этой команды?

Lubuntu 13.10 х86_64
Ubuntu 14.04 x86_64

16 (25.01.2014 18:44:34 отредактировано allez)

baron_P пишет:

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

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

baron_P пишет:

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

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

echo "$zarad"

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

17

Слоупочу - комп был занят сутками, не до баловства с ИБП было.
Скрипт изменил так:

 Консоль:
#!/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

В кроне сделал так:
 Консоль:
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

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

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

log1:
37
37
battary
<42%

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

Lubuntu 13.10 х86_64
Ubuntu 14.04 x86_64

18

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

override.battery.charge.low = 42

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

История показывает, что во всем новом обычно кроется какой-то подвох.
Классическая ошибка, которую совершают проектировщики
абсолютно надежных систем, - недооценка изобретательности клинических идиотов.

19 (03.02.2014 10:56:30 отредактировано baron_P)

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

Lubuntu 13.10 х86_64
Ubuntu 14.04 x86_64

20

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

[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/

История показывает, что во всем новом обычно кроется какой-то подвох.
Классическая ошибка, которую совершают проектировщики
абсолютно надежных систем, - недооценка изобретательности клинических идиотов.

21

baron_P, а какой драйвер используется?
Покажите /etc/nut/ups.conf

История показывает, что во всем новом обычно кроется какой-то подвох.
Классическая ошибка, которую совершают проектировщики
абсолютно надежных систем, - недооценка изобретательности клинических идиотов.

22

В итоге получается вот что. Скрипт /etc/upsdown.sh в таком виде:

 Консоль:
#!/bin/sh
stat=$(upsc ippon700 ups.status)
zarad=$(upsc ippon700 battery.charge)
if [ "$stat" = "OB" ]
   then
        if [ $zarad -le 45 ]
          then
                shutdown -Ph +0
        fi
fi
exit 0

По sudo crontab -e (здесь задания выполняются от рута, как я понял) записал такое:
 Консоль:
MAILTO=""
SHELL=/bin/bash
PATH=/bin:/sbin:/usr/sbin:/usr/bin
* * * * * /etc/upsdown.sh

Работает как и задумано: по процентам battery.charge выключает комп.

Описание этих параметров я читал, но не совсем понял за что они отвечают.
offdelay - время ожидания перед отключением UPS. Непонятно, по какому событию и откуда появляется команда на отключение.
ondelay - время ожидания перед включением UPS. Тут совсем непонятно. UPS отключается при критическом разряде во время работы от батареи, а при появлении напряжения в сети, он ждет это время перед тем как включиться?

Конфиг /etc/nut/ups.conf:

 Консоль:
[ippon700]
driver = blazer_usb
port = auto
desc = "IPPON Black Power Pro 700"
default.battery.voltage.high = 13.60
default.battery.voltage.low = 10.60
offdelay = 6
ondelay = 7

Lubuntu 13.10 х86_64
Ubuntu 14.04 x86_64