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

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

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

    И так пока я обиваю пороги что бы меня взяли на работу, поделюсь своим решение как создать рабочие часы для любого скрипта в 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 MugiwaraM 2 ответов Последний ответ
    👍
    3
    • 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
                                • Лента
                                • Категории
                                • Последние
                                • Метки
                                • Популярные
                                • Пользователи
                                • Группы