Запуск команды на определенный период времени

Автор shteinx, апреля 06, 2014, 21:23:39

« предыдущая - следующая »

shteinx

Здравствуйте коллеги! На работе нужно запускать программу снятия изображения рабочего стола на период рабочего дня, то есть с 9:00 до 18:00. Нашел отличную программу scrot, которая реализует необходимый функционал командой
while true; do scrot -d 60 '%Y-%m-%d-%H-%M-%S_WS.png' -e 'mv $f ~/Screen/'; done
Таким образом 1 раз в минуту (60 секунд) делается скриншот и записывается в папку ~/Screen/
Вопрос - как осуществить планировку запуска?
На ум приходят идеи:
1. Заменить условие true в цикле на время с 9 до 18 часов. Как это сделать не имею ни малейшего понятия. ABS guide поковырял, но ничего так и не понял. Для моей задачи нужен минимум, а чтобы его найти придется осилить максимум.
2. Запускать через cron, но тогда нужно будет как-то завершать процесс в 18 часов и нет защиты от возможной перезагрузки компа во время рабочего дня.

Надеюсь на ваши здравые идеи!

destruct™

просто читаем ман к cron и создаём расписание запуска ежечасно с 9 до 18 0 9-18/1 * * 1 /путь_к_скрипту/скрипт сам скрипт /*читаем ман к scrot*/  (без -d 60) настраиваем на одиночный снимок примерно так #!/bin/bash
scrot '%Y-%m-%d-%H-%M-%S_WS.png' -e 'mv $f ~/Screen/'
не забываем сделать исполняемым)
углубившись можно настроить выполнение только по рабочим дням и пакетировать снимки в папки по дням/неделям/отдельно взятой машине/пользователе и т.д. и т.п. мануал в помощь)

shteinx

Маны к cron'у поизучал. Создал crontab командой crontab -e для текущего пользователя с содержанием
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
* * * * * /home/alexandr/scripts/shot.sh
* * * * * cp /home/alexandr/6.mkv /home/alexandr/vid/
с двумя заданиями специально для контроля cron'а что он работает, создал скрипт
#!/bin/bash
scrot '%Y-%m-%d_%H-%M-%S_WS11.png' -e 'mv $f /home/alexandr/Screen/'
сохранил его в /home/alexandr/scripts/shot.sh
сделал исполняемым sudo chmod +x shot.sh
Crontab сохранился корректно, при вводе команды crontab -l выводится содержимое моего расписания.
При работе cron'а строка * * * * * /home/alexandr/scripts/shot.sh не работает, а * * * * * cp /home/alexandr/6.mkv /home/alexandr/vid/ работает исправно.
При запуске скрипта вручную работает идеально, а с cron'ом не хочет!
Все уже перепробовал, незнаю где собака порылась.

destruct™

апреля 08, 2014, 00:30:55 #3 Последнее редактирование: апреля 08, 2014, 00:38:14 от destruct™
а если SHELL=/bin/bash указать? и/или попробовать * * * * * sh /home/alexandr/scripts/shot.sh ?

З.Ы. зачем отдельным скриптом? и каждую минуту запускать? тотальная слежка?))) если можно его конкретно в cron настроить? есть даж пример разжеванный

shteinx

Обо всем по порядку:
1) Я пока не сильно понимаю как работают команды в интерпретаторе. Не знаю где лучше просто указать команду с параметрами, а где написать скрипт. Учиться, учиться и еще раз учиться.
2) Тотальная слежка!? Есть недобросовестные сотрудники, есть новые менеджеры продаж, которые предпочитают искать новую работу на новой работе и получать за это деньги. Скорее не слежка, а понимание на какой вид деятельности преимущественно уходит рабочее время.

shteinx

В том то и дело, что насколько ни разжеван пример - все равно не работает.
Знаю, что где-то у меня косяк, но где?
SHELL=/bin/bash
MAILTO=alexandr
HOME=/home/alexandr
* * * * * scrot

По идее сейчас скриншот должен появляться в папке ~/
,но ничего не появляется.
Не подскажите как сделать вывод в лог ошибок или что-то нечто подобное?

destruct™

вообщем скрипт такой
Код (shot.sh) Выделить
#!/bin/sh
# Тут можно временно бросить файл)
HOME=/tmp
# Дисплей указываем чтоб небыло лишних вопросов)
export DISPLAY=:0.0
# Собственно что нам надо)
scrot '%Y-%m-%d_%H-%M-%S_WS11.png' -e 'mv $f /home/alexandr/Screen/'
exit 0


Код (crontab) Выделить
SHELL=/bin/bash
MAILTO=alexandr
* * * * * /home/alexandr/scripts/shot.sh


Для ведения лога убираем # перед строкой
Код (/etc/rsyslog.conf) Выделить
cron.* /var/log/cron.log и перезапускаем sudo /etc/init.d/rsyslog restart
смотрим /var/log/cron.log

shteinx

Ваш скрипт сразу заработал, в логах сообщения вида:
Apr  8 08:22:24 piano anacron[1129]: Anacron 2.3 started on 2014-04-08
Apr  8 08:22:24 piano cron[1062]: (CRON) INFO (pidfile fd = 3)
Apr  8 08:22:24 piano cron[1163]: (CRON) STARTUP (fork ok)
Apr  8 08:22:24 piano anacron[1129]: Normal exit (0 jobs run)
Apr  8 08:22:24 piano cron[1163]: (CRON) INFO (Running @reboot jobs)
Apr  8 08:22:28 piano anacron[1944]: Anacron 2.3 started on 2014-04-08
Apr  8 08:22:28 piano anacron[1944]: Normal exit (0 jobs run)
Apr  8 08:23:01 piano CRON[2331]: (root) CMD (/home/alexandr/scripts/shot)
Apr  8 08:23:01 piano CRON[2329]: (CRON) info (No MTA installed, discarding output)
Apr  8 08:23:01 piano CRON[2333]: (alexandr) CMD (/home/alexandr/scripts/shot.sh)
Apr  8 08:24:01 piano CRON[2345]: (root) CMD (/home/alexandr/scripts/shot)
Apr  8 08:24:01 piano CRON[2343]: (CRON) info (No MTA installed, discarding output)
Apr  8 08:24:01 piano CRON[2347]: (alexandr) CMD (/home/alexandr/scripts/shot.sh)
Apr  8 08:25:01 piano CRON[2354]: (root) CMD (/home/alexandr/scripts/shot)
Apr  8 08:25:01 piano CRON[2355]: (alexandr) CMD (/home/alexandr/scripts/shot.sh)
Apr  8 08:25:01 piano CRON[2352]: (CRON) info (No MTA installed, discarding output)

И далее в этом же духе.
Не понял только для чего
HOME=/tmp
export DISPLAY=:0.0
exit 0
можно поподробнее?
Спасибо за грамотные ответы!!!

destruct™

я же вроде откоменнтировал строки)
HOME=/tmp указана для того чтоб скрипт знал где создавать временный файл
export DISPLAY=:0.0 задаёт экран с которого снимается скриншот (ибо cron понятия не имеет какой и где экран и от этого при запуске scrot он отваливается)
exit 0 - эту строку geany сам добавил)

shteinx

Вот спасибо! В интернете всюду пишут, что cron имеет свои переменные окружения, а какие переменные - не уточняют. По опыту знаю, самые простые вещи на самом деле самые сложные. О них не говорят, типа все и так должны это знать. А копни поглубже - единицы могут внятно ответить по делу!!!