Правило when cron: многократный запуск

Я, конечно, не специалист, но везде пишут, что "*/5 * * * *" означает “раз в 5 минут”, но у меня это when: cron("*/5 * * * *") работает раз в пять секунд. У меня не получается понять документацию, там вроде 6 позиций, а не пять. Я хотел бы уточнить у знающих людей, что если я напишу "* */5 * * * *", то будет раз в пять минут. Или там 0 надо вначале? Спасибо

upd Я теперь думаю, что оно не просто раз в 5 секунд запускается, а просто запускается много раз одновременно. Видимо, я что0то глобально напутал, посмотрите, пожалуйста, скрипт и лог ниже

Пытаюсь запостить сюда мой скрипт, мне сайт выдает ошибку:

Error: the ‘ucdWarningModal’ modal needs updating to work with the latest version of Discourse. See https://meta.discourse.org/t/268057.

Извините, что заспамил, далее текст скрипта и лог. Если что, после редактирования правила перезагружался и движок правил перезапускал

var mainsUpTime = 0;

defineRule("wakeSuperKorz", {
    when: cron("* */5 * * * *"), // every five minutes
    then: function () {

        // check wake command
        runShellCommand("test -f /root/superkorz/wakemeup", {
            exitCallback: function (exitCode) {
                if (exitCode === 0) { // need to wake up
                    log("Superkorz is down");
                    if (dev['wb-map3e_45/Urms L1'] > 210) {
                        mainsUpTime += 5; // every five minutes
                        log("Power is present for " + mainsUpTime + " minutes");
                    } else {
                        mainsUpTime = 0; 
                        log("No power");
                    }

                    if (mainsUpTime >= 30) {
                        log("As power is present for " + mainsUpTime + " minutes, starting up Superkorz");
                        runShellCommand("rm /root/superkorz/wakemeup && wakeonlan zz-zz-zz-zz-zz-zz");
                    }


                } else {

                    mainsUpTime = 0;

                }
            }
        });

    }
});

Лог:

31-07-2024 20:30:05.020 [wb-rules] 	INFO: [rule info] As power is present for 30 minutes, starting up Superkorz
31-07-2024 20:30:05.020 [wb-rules] 	INFO: [rule info] As power is present for 30 minutes, starting up Superkorz
31-07-2024 20:30:05.019 [wb-rules] 	INFO: [rule info] Power is present for 30 minutes
31-07-2024 20:30:05.016 [wb-rules] 	INFO: [rule info] Superkorz is down
31-07-2024 20:30:04.016 [wb-rules] 	INFO: [rule info] Power is present for 25 minutes
31-07-2024 20:30:04.015 [wb-rules] 	INFO: [rule info] Superkorz is down
31-07-2024 20:30:03.017 [wb-rules] 	INFO: [rule info] Power is present for 20 minutes
31-07-2024 20:30:03.015 [wb-rules] 	INFO: [rule info] Superkorz is down
31-07-2024 20:30:02.018 [wb-rules] 	INFO: [rule info] Power is present for 15 minutes
31-07-2024 20:30:02.016 [wb-rules] 	INFO: [rule info] Superkorz is down
31-07-2024 20:30:01.649 [cron] 	(root) CMD (~/duckdns/duck.sh >/dev/null 2>&1)
31-07-2024 20:30:01.649 [cron] 	(root) CMD (~/duckdns/duck.sh >/dev/null 2>&1)
31-07-2024 20:30:01.633 [cron] 	pam_unix(cron:session): session opened for user root(uid=0) by (uid=0)
31-07-2024 20:30:01.017 [wb-rules] 	INFO: [rule info] Power is present for 10 minutes
31-07-2024 20:30:01.015 [wb-rules] 	INFO: [rule info] Superkorz is down
31-07-2024 20:30:00.019 [wb-rules] 	INFO: [rule info] Power is present for 5 minutes
31-07-2024 20:30:00.014 [wb-rules] 	INFO: [rule info] Superkorz is down

Переписал просто на setInterval, работает. Для меня это solution, но, может быть, я багу открыл, а кому-то нужен этот cron

Здравствуйте! Я не разработчик WB, но случайно наткнулся на ваш пост и мне показалось, что проблема у меня была очень похожая:

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

1 лайк

Если надо раз в 5 минут, то можно проще: cron("@every 5m").

/5 - это шаг, без стартовой позиции оно не работает, правильно так:
*/5 - 5, 10, 15
1/5 - 1, 6, 11…

то будет каждые 5 минут

Спасибо. Я попробовал. Лог выше - результат такой настройки. Происходит каждые 2-3 милисекунды.

Согласен, написал некорректно. Правильная команда: “00 */5 * * * *”

Помечу как solution, вдруг и правда у кого-то сработает. Сам проверять не буду, свою проблему решил по-другому. Для меня эта библиотека cron останется загадкой навсегда

Чтобы не было сомнений.
Правило:

defineRule("cronRule", {
  when: cron("00 */2 * * * *"),
  then: function () {
    var date = new Date();
    log.info('{}:{}', date.getMinutes(), date.getSeconds())
  },
});

результат:
image