Ответ для тех, кто всё еще ищет
Дело в том, что pm2 был придуман для того, чтобы запускать процессы на сервере и они работали 24/7, а в случае если произошла ошибка - процесс автоматически перезапускался. В вашем же случае скрипт конечный:
- Запуск скрипта
- Проход всех итераций
- Завершение работы скрипта
Для pm2 завершение работы скрипта служит сигналом о том, что его необходимо перезапустить, даже если вы укажите параметр --cron. Для того, чтобы скрипт запускался действительно по крону, необходимо явно указать, что автоматический перезапуск не требуется, с помощью ключа --no-auorestart.
Например:
pm2 start index.js --cron "* * * * *" --no-autorestart