Как сделать рабочие часы для скрипта
-
И так пока я обиваю пороги что бы меня взяли на работу, поделюсь своим решение как создать рабочие часы для любого скрипта в js.
У нас имеется скрипт который выполняет какие-то действия скажем постоянно 24/7 и нам необходимо сделать так что бы он к примеру работал с 8 утра до 17 вечера.
Вот наша часть которая запускает нашу функцию чего-либо:
setInterval(() => { periodicTask(arr).catch((err) => { console.error(`Ошибка блин...`, err); }); }, intervalMs);Надеюсь всем понятно что
intervalMs- это интервал с какой периодичностью необходимо выполнять действия.А теперь переходим к самому интересному, вот у нас есть функция
periodicTaskи нам нужно как-то откладывать задачи которыеsetInterval()на поставляет.Самый важный момент это то что сам
setInterval()продолжает работать и не уходит в какую либо спячку дожидаться своего времени.Да можно было бы нагромоздить логики по типу “значит когда задача будет выполняться в интервале часов 16-17 мы меняет интервал на несколько часов” и т.п.
Лишне все это лишнее! Заболталась что-то, продолжаем. Для дальнейшего нам потребуется сделать функцию нашего рабочего времени:
function workingHours(data = new Date()) { const hour = data.getHours(); return hour >= 8 && hour < 17; }Понятно? Если нет то - мы в функции берем объект
Dateзабираем от туда текущий час и возвращает наше будущее условие.Теперь возвращаемся к нашей функции
periodicTask:function periodicTask(arr) { if (!workingHours()) { console.log("Рабочий день уже закончился, не буду ничего делать!"); return; } // Ну а дальше логика нашей задачи }Понятно!!!??? Мы в самом начале функции
periodicTaskставим условие для проверки времени рабочих часов, и если сейчас не рабочее время тоworkingHours()вернет намfalse, в следствии чего вернетreturnи ничего не произойдет.Еще раз для закрепления -
returnне останавливает интервал, он всего лишь завершает текущий вызовperiodicTask!!!
Сам интервал живет отдельно, как и выше писала можно заморочиться нагромоздить всякой ерунды, но это более чем рабочий вариант.p.s. С Ханной все сложное - легко, и да возьмите уже на работу

@hannadev Решение нормальное, но конечно проблема что
setInterval()то будет в любом случает в установленное время таску запрашивать. -
И так пока я обиваю пороги что бы меня взяли на работу, поделюсь своим решение как создать рабочие часы для любого скрипта в js.
У нас имеется скрипт который выполняет какие-то действия скажем постоянно 24/7 и нам необходимо сделать так что бы он к примеру работал с 8 утра до 17 вечера.
Вот наша часть которая запускает нашу функцию чего-либо:
setInterval(() => { periodicTask(arr).catch((err) => { console.error(`Ошибка блин...`, err); }); }, intervalMs);Надеюсь всем понятно что
intervalMs- это интервал с какой периодичностью необходимо выполнять действия.А теперь переходим к самому интересному, вот у нас есть функция
periodicTaskи нам нужно как-то откладывать задачи которыеsetInterval()на поставляет.Самый важный момент это то что сам
setInterval()продолжает работать и не уходит в какую либо спячку дожидаться своего времени.Да можно было бы нагромоздить логики по типу “значит когда задача будет выполняться в интервале часов 16-17 мы меняет интервал на несколько часов” и т.п.
Лишне все это лишнее! Заболталась что-то, продолжаем. Для дальнейшего нам потребуется сделать функцию нашего рабочего времени:
function workingHours(data = new Date()) { const hour = data.getHours(); return hour >= 8 && hour < 17; }Понятно? Если нет то - мы в функции берем объект
Dateзабираем от туда текущий час и возвращает наше будущее условие.Теперь возвращаемся к нашей функции
periodicTask:function periodicTask(arr) { if (!workingHours()) { console.log("Рабочий день уже закончился, не буду ничего делать!"); return; } // Ну а дальше логика нашей задачи }Понятно!!!??? Мы в самом начале функции
periodicTaskставим условие для проверки времени рабочих часов, и если сейчас не рабочее время тоworkingHours()вернет намfalse, в следствии чего вернетreturnи ничего не произойдет.Еще раз для закрепления -
returnне останавливает интервал, он всего лишь завершает текущий вызовperiodicTask!!!
Сам интервал живет отдельно, как и выше писала можно заморочиться нагромоздить всякой ерунды, но это более чем рабочий вариант.p.s. С Ханной все сложное - легко, и да возьмите уже на работу

Пользователь @hannadev написал в Как сделать рабочие часы для скрипта:
function workingHours(data = Date ()) {
const hour = data.getHours();
return hour >= 8 && hour < 17;
}мне кажется код не рабочий, ты его запускала? у data должен быть новый экземпляр new Date()
-
и как можно называть переменную, которая отвечает за дату -
dataа неdate? -
js это все конечно весело, но каждый инструмент нужен для своего, вот вариант на crontab, оно будет и легче по ресурсам.
* 8-17 * * * /usr/bin/node /path/to/script.js >> /var/log/myjob.log 2>&1 -
можно перезапускать по крону или по pm2 скрипт (pm2 будет каждый раз перезапускаться после завершения при стандартных настройках)
а проверку можно сделать еще и в скриптеconst now = new Date(); const hour = now.getHours(); if (hour < 8 || hour > 17) { process.exit(0); } // тут ваша логика -
Пользователь @hannadev написал в Как сделать рабочие часы для скрипта:
function workingHours(data = Date ()) {
const hour = data.getHours();
return hour >= 8 && hour < 17;
}мне кажется код не рабочий, ты его запускала? у data должен быть новый экземпляр new Date()
@Mugiwara Поправила!!!
-
@Linus Вы чего напали то людоеды блин…

-
можно перезапускать по крону или по pm2 скрипт (pm2 будет каждый раз перезапускаться после завершения при стандартных настройках)
а проверку можно сделать еще и в скриптеconst now = new Date(); const hour = now.getHours(); if (hour < 8 || hour > 17) { process.exit(0); } // тут ваша логика@Mugiwara Вот эта нормальная тема, а как в pm2 настроить такое то?
-
@hannadev
пример скрипта который выполняет что-то// script.js async function main() { console.log(`[${new Date().toISOString()}] Запуск скрипта через PM2`); // Эмуляция работы await new Promise(r => setTimeout(r, 2000)); console.log('Работа выполнена.'); // ОБЯЗАТЕЛЬНО: завершаем процесс, чтобы PM2 не перезапускал его мгновенно, // а ждал следующего тика Cron. process.exit(0); } main();вот команда pm2 где
30- количество минут которое он ждет до следующего рестарта, нужно указать не меньше минут чем время выполнения скрипта( его бы надо примерно знгать)pm2 start script.js --cron "*/30 8-17 * * *" --no-autorestartеще момент: pm2 работает так, что если выйдет ошибка - то скрипт сразу перезапускается
-
@hannadev
пример скрипта который выполняет что-то// script.js async function main() { console.log(`[${new Date().toISOString()}] Запуск скрипта через PM2`); // Эмуляция работы await new Promise(r => setTimeout(r, 2000)); console.log('Работа выполнена.'); // ОБЯЗАТЕЛЬНО: завершаем процесс, чтобы PM2 не перезапускал его мгновенно, // а ждал следующего тика Cron. process.exit(0); } main();вот команда pm2 где
30- количество минут которое он ждет до следующего рестарта, нужно указать не меньше минут чем время выполнения скрипта( его бы надо примерно знгать)pm2 start script.js --cron "*/30 8-17 * * *" --no-autorestartеще момент: pm2 работает так, что если выйдет ошибка - то скрипт сразу перезапускается
@Mugiwara То есть хочешь сказать отпадает смысл вообще в
setInterval()? -
@kirilljsx Сначала надо понять какая цель у интервала, можно и без него перезапускать скрипт после завершения через pm2, я же привел пример, когда надо задать именно интервал? а так каждый газует как хочет, вон, предложили кронтаб использовать, самый простой и производительный вариант.
Но если ты скрипт будет все равно на pm2 вешать, что скорее всего так и произойдет, то удобнее его интегрировать сразу. А если без pm2, то тебе еще ошибки ловить, как-то перезапускать если что-то не так
-
@kirilljsx Сначала надо понять какая цель у интервала, можно и без него перезапускать скрипт после завершения через pm2, я же привел пример, когда надо задать именно интервал? а так каждый газует как хочет, вон, предложили кронтаб использовать, самый простой и производительный вариант.
Но если ты скрипт будет все равно на pm2 вешать, что скорее всего так и произойдет, то удобнее его интегрировать сразу. А если без pm2, то тебе еще ошибки ловить, как-то перезапускать если что-то не так
@Mugiwara А вот как раз напрашивается вопрос производительности и оптимизации что лучшее поебывать
setInterval()илиpm2
Как говориться есть 2 стула)) -
Очередной вкатун)))
-
© 2024 - 2025 ExLends, Inc. Все права защищены.