Перейти к содержанию
  • Лента
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы
Свернуть
exlends
Категории
  1. Главная
  2. Категории
  3. Языки программирования
  4. JavaScript
  5. Как сделать рабочие часы для скрипта

Как сделать рабочие часы для скрипта

Запланировано Прикреплена Закрыта Перенесена JavaScript
javascript
15 Сообщения 5 Постеры 140 Просмотры
  • Сначала старые
  • Сначала новые
  • По количеству голосов
Ответить
  • Ответить, создав новую тему
Авторизуйтесь, чтобы ответить
Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
  • hannadevH hannadev

    И так пока я обиваю пороги что бы меня взяли на работу, поделюсь своим решение как создать рабочие часы для любого скрипта в 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. С Ханной все сложное - легко, и да возьмите уже на работу 😥

    kirilljsxK Не в сети
    kirilljsxK Не в сети
    kirilljsx
    js
    написал в отредактировано
    #2

    @hannadev Решение нормальное, но конечно проблема что setInterval() то будет в любом случает в установленное время таску запрашивать.

    1 ответ Последний ответ
    1
    • hannadevH hannadev

      И так пока я обиваю пороги что бы меня взяли на работу, поделюсь своим решение как создать рабочие часы для любого скрипта в 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. С Ханной все сложное - легко, и да возьмите уже на работу 😥

      MugiwaraM Не в сети
      MugiwaraM Не в сети
      Mugiwara
      написал в отредактировано Mugiwara
      #3

      Пользователь @hannadev написал в Как сделать рабочие часы для скрипта:

      function workingHours(data = Date ()) {
      const hour = data.getHours();
      return hour >= 8 && hour < 17;
      }

      мне кажется код не рабочий, ты его запускала? у data должен быть новый экземпляр new Date()

      hannadevH 1 ответ Последний ответ
      3
      • LinusL Не в сети
        LinusL Не в сети
        Linus
        написал в отредактировано
        #4

        и как можно называть переменную, которая отвечает за дату - data а не date?

        hannadevH 1 ответ Последний ответ
        5
        • LinusL Не в сети
          LinusL Не в сети
          Linus
          написал в отредактировано
          #5

          js это все конечно весело, но каждый инструмент нужен для своего, вот вариант на crontab, оно будет и легче по ресурсам.

          * 8-17 * * * /usr/bin/node /path/to/script.js >> /var/log/myjob.log 2>&1
          
          1 ответ Последний ответ
          5
          • MugiwaraM Не в сети
            MugiwaraM Не в сети
            Mugiwara
            написал в отредактировано
            #6

            можно перезапускать по крону или по pm2 скрипт (pm2 будет каждый раз перезапускаться после завершения при стандартных настройках)
            а проверку можно сделать еще и в скрипте

            const now = new Date();
            const hour = now.getHours();
            
            if (hour < 8 || hour > 17) {
              process.exit(0);
            }
            
            // тут ваша логика
            
            hannadevH 1 ответ Последний ответ
            👍
            3
            • MugiwaraM Mugiwara

              Пользователь @hannadev написал в Как сделать рабочие часы для скрипта:

              function workingHours(data = Date ()) {
              const hour = data.getHours();
              return hour >= 8 && hour < 17;
              }

              мне кажется код не рабочий, ты его запускала? у data должен быть новый экземпляр new Date()

              hannadevH Не в сети
              hannadevH Не в сети
              hannadev
              написал в отредактировано
              #7

              @Mugiwara Поправила!!!

              1 ответ Последний ответ
              2
              • LinusL Linus

                и как можно называть переменную, которая отвечает за дату - data а не date?

                hannadevH Не в сети
                hannadevH Не в сети
                hannadev
                написал в отредактировано
                #8

                @Linus Вы чего напали то людоеды блин… 😧

                1 ответ Последний ответ
                1
                • MugiwaraM Mugiwara

                  можно перезапускать по крону или по pm2 скрипт (pm2 будет каждый раз перезапускаться после завершения при стандартных настройках)
                  а проверку можно сделать еще и в скрипте

                  const now = new Date();
                  const hour = now.getHours();
                  
                  if (hour < 8 || hour > 17) {
                    process.exit(0);
                  }
                  
                  // тут ваша логика
                  
                  hannadevH Не в сети
                  hannadevH Не в сети
                  hannadev
                  написал в отредактировано
                  #9

                  @Mugiwara Вот эта нормальная тема, а как в pm2 настроить такое то?

                  MugiwaraM 1 ответ Последний ответ
                  2
                  • hannadevH hannadev

                    @Mugiwara Вот эта нормальная тема, а как в pm2 настроить такое то?

                    MugiwaraM Не в сети
                    MugiwaraM Не в сети
                    Mugiwara
                    написал в отредактировано Mugiwara
                    #10

                    @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 работает так, что если выйдет ошибка - то скрипт сразу перезапускается

                    kirilljsxK 1 ответ Последний ответ
                    4
                    • MugiwaraM Mugiwara

                      @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 работает так, что если выйдет ошибка - то скрипт сразу перезапускается

                      kirilljsxK Не в сети
                      kirilljsxK Не в сети
                      kirilljsx
                      js
                      написал в отредактировано
                      #11

                      @Mugiwara То есть хочешь сказать отпадает смысл вообще в setInterval() ?

                      MugiwaraM 1 ответ Последний ответ
                      1
                      • kirilljsxK kirilljsx

                        @Mugiwara То есть хочешь сказать отпадает смысл вообще в setInterval() ?

                        MugiwaraM Не в сети
                        MugiwaraM Не в сети
                        Mugiwara
                        написал в отредактировано Mugiwara
                        #12

                        @kirilljsx Сначала надо понять какая цель у интервала, можно и без него перезапускать скрипт после завершения через pm2, я же привел пример, когда надо задать именно интервал? а так каждый газует как хочет, вон, предложили кронтаб использовать, самый простой и производительный вариант.

                        Но если ты скрипт будет все равно на pm2 вешать, что скорее всего так и произойдет, то удобнее его интегрировать сразу. А если без pm2, то тебе еще ошибки ловить, как-то перезапускать если что-то не так

                        kirilljsxK 1 ответ Последний ответ
                        4
                        • MugiwaraM Mugiwara

                          @kirilljsx Сначала надо понять какая цель у интервала, можно и без него перезапускать скрипт после завершения через pm2, я же привел пример, когда надо задать именно интервал? а так каждый газует как хочет, вон, предложили кронтаб использовать, самый простой и производительный вариант.

                          Но если ты скрипт будет все равно на pm2 вешать, что скорее всего так и произойдет, то удобнее его интегрировать сразу. А если без pm2, то тебе еще ошибки ловить, как-то перезапускать если что-то не так

                          kirilljsxK Не в сети
                          kirilljsxK Не в сети
                          kirilljsx
                          js
                          написал в отредактировано
                          #13

                          @Mugiwara А вот как раз напрашивается вопрос производительности и оптимизации что лучшее поебывать setInterval() или pm2
                          Как говориться есть 2 стула))

                          1 ответ Последний ответ
                          1
                          • DinozaurD Не в сети
                            DinozaurD Не в сети
                            Dinozaur
                            написал в отредактировано
                            #14

                            Очередной вкатун)))

                            hannadevH 1 ответ Последний ответ
                            2
                            • DinozaurD Dinozaur

                              Очередной вкатун)))

                              hannadevH Не в сети
                              hannadevH Не в сети
                              hannadev
                              написал отредактировано
                              #15

                              @Dinozaur

                              1 ответ Последний ответ
                              0

                              Категории

                              • Главная
                              • Новости
                              • Фронтенд
                              • Бекенд
                              • Языки программирования

                              Контакты

                              • Сотрудничество
                              • info@exlends.com
                              • Наш чат
                              • Наш ТГ канал

                              © 2024 - 2025 ExLends, Inc. Все права защищены.

                              Политика конфиденциальности
                              • Войти

                              • Нет учётной записи? Зарегистрироваться

                              • Войдите или зарегистрируйтесь для поиска.
                              • Первое сообщение
                                Последнее сообщение
                              0
                              • Лента
                              • Категории
                              • Последние
                              • Метки
                              • Популярные
                              • Пользователи
                              • Группы