Cron не работает

Здравствуйте.
Судя по логам, cron молчит.
В терминале вижу вот это:
root@wirenboard-ARAXKJYF:~# ps wax | grep cron
13052 pts/2 S+ 0:00 grep cron

Может что-то надо было ещё установить после полной переустановки системы?

Нужно установить крон :slight_smile:

Если речь идёт о кроне, который используется в движке правил, то там используется своя внутренняя реализация, а не общесистемный cron, так что отдельного процесса это не порождает.

Если Вам для каких-то целей нужен общий, тогда его действительно нужно установить: apt-get install cron, но это уже не связано с движком правил.

Именно так.

Вот сценарии в скрипте, ни один не срабатывает.

//Контроль за отключением определенных приточных клапанов в полночь
defineRule(“Air_Valves_Midnight_Time_Control”, {
when: cron("@midnight"), // in 00:00 every day
then: function () {
for (var i=1; i<4; i++) {
if (dev[“Air_Valve_Stroke_1_”+String(i)][“open”]) {
dev[“wb-mio-gpio_191:2”][“DIR”+String(i)] = false;
dev[“Air_Valve_Stroke_1_”+String(i)][“open”] = false;
log(“AIR VALVE{}: {} BY SCHEDULE”,String(i),air_valve_finish_status[Number(dev[“Air_Valve_Stroke_1_”+String(i)][“open”])]);
}
}
}
});

//Контроль за включением определенных приточных клапанов утром
defineRule(“Air_Valves_Midnight_Time_Control”, {
when: cron(“0 7 * * *”), // in 07:00 every day
then: function () {
for (var i=3; i<4; i++) {
if (!dev[“Air_Valve_Stroke_1_”+String(i)][“open”]) {
dev[“wb-mio-gpio_191:2”][“DIR”+String(i)] = true;
dev[“Air_Valve_Stroke_1_”+String(i)][“open”] = true;
log(“AIR VALVE{}: {} BY SCHEDULE”,String(i),air_valve_finish_status[Number(dev[“Air_Valve_Stroke_1_”+String(i)][“open”])]);
}
}
}
});

//Контроль за температурой в подвале с проверкой каждый час
defineRule(“CELLAR_VENTILATION_Control”, {
when: cron("@hourly"), // hourly check
then: function () {
if (dev[“wb-w1/28-000006aad7ae”] > dev.Cellar_Temperature.volume + delta_temp) { //если температура датчика больше установленного значения
dev[“wb-gpio”][“EXT1_R3A1”] = 1;
delta_temp = 0;
} else {
dev[“wb-gpio”][“EXT1_R3A1”] = 0;
delta_temp = 1;
}
schedule_vent = true;
log("SCHEDULE CELLAR TEMPERATURE CHECKING… [{} vs {}] VENT status: {} ", dev[“wb-w1/28-000006aad7ae”],dev.Cellar_Temperature.volume + delta_temp, switch_status[1-delta_temp]);
}
});

Очень странно. Самый простой вариант вроде этого работает?

defineRule("test_cron", {
  when: cron("* * * * * *"),
  then: function() { log("Cron!"); }
});

На всякий случай, кое в чём параметры внутреннего cron немного отличаются от традиционных - там добавлен параметр “секунда” - самое первое поле означает секунды, а не минуты. Подробнее о синтаксисе здесь.

cron("* * * * * *") выполняется каждую секунду.
cron(“0 * * * * *”) выполняется каждую минуту.

вообщем надо разбираться как он тогда работает.

В остальном он должен работать так же, как классический cron, только добавляется ещё один столбец спереди для секунд. Для совместимости с обычным cron можно просто ставить туда 0.

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

Можете прислать весь скрипт?

1 лайк

Нашёл проблему. Некоторые правила имели одинаковые имена. Исправил на уникальные и заработало. ))

Добрый день.
Не работает правило:

defineRule("startAthome", {
  when: cron("0 0 7 ? * MON,TUE,WED,THU,FRI *") || 
  cron("0 15 18 ? * MON,TUE,WED,THU,FRI *") || 
  cron("0 0 9 ? * SUN,SAT *"),
  then: function () {
    dev["homeState"]["At home"] = true;
    dev["homeState"]["Asleep"] = false;
    log("At home mode start");
  }
});

В чем может быть ошибка?

changer, извините за задержку с ответом, у вас 7 позиций в cron-выражении, а надо 6:
(подробнее по ссылке https://godoc.org/github.com/robfig/cron#hdr-CRON_Expression_Format из статьи https://github.com/contactless/wb-rules )

Ок, спасибо. Значит несколько крон выражений с логическими операторами как в примере должны работать. Отлично! :slight_smile:

Вот проверил сейчас еще и логические операторы и не получается с ними. Похоже, все сложнее, чем кажется.