Я создал python программу для мониторинга моих процессов из текстового файла и отправки электронного письма, если они не возвращают PID. Это сработало нормально, но когда я настроил его в pm2, он начал постоянно перезагружаться, что наводнило меня на электронные письма. То есть в течение 60 секунд pm2 ls сообщил о 60 перезапусках для моего сервиса, и я получил об этом множество электронных писем, в которых говорилось, что процесс не работает.
Вот код для моего сервиса:
#monitor.py
import subprocess
class ProcessCheck():
def name(self):
return "ProcessCheck"
def check_process(name):
child = subprocess.Popen(['pgrep', '-f', name], stdout=subprocess.PIPE, shell=False)
response = child.communicate()[0]
pid = response.split()
if len(pid) == 0:
return False
else:
print("PID is %s" % pid)
return True
#alertService.py
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
def send_email(app_list):
sender_email = "test@test.com"
receiver_email = "test@test.com"
message = MIMEMultipart("alternative")
message["Subject"] = "No PID found"
message["From"] = sender_email
message["To"] = receiver_email
message_construct = "this is a test message for failed {}"
message_text = message_construct.format(app_list)
message.attach(MIMEText(message_text, "plain"))
message.attach(MIMEText(message_text, "html"))
try:
smtpObj = smtplib.SMTP(<smtp url>, <smtp port>)
smtpObj.ehlo()
smtpObj.sendmail(sender_email, receiver_email, message.as_string())
smtpObj.quit()
print("Successfully sent email.")
return null
#app.py
from monitor import *
from alertService import *
import os.path
down_apps = []
sendEmail=False
if os.path.exists("list.txt"):
list_file = open("list.txt", "r")
for line in list_file:
appName = line.strip()
if ProcessCheck.check_process(appName) is False:
print("Unable to find PID for %s. Sending email alert" % appName)
down_apps.append(appName)
sendEmail = True
else:
print("Found PID for %s" % appName)
list_file.close()
else:
print("No process list detected")
if sendEmail == True:
print("Sending email for downed processes")
send_email(down_apps)
else:
print("All processes are up at this time")
Моя конфигурация pm2:
{
"apps" : [
{
"name": "processmon",
"script": "/home/user1/test/processmon/monitor/app.py",
"pid_file": "~/test/processmon/bin",
"out_file": "~/test/processmon/logs/processmon.log",
"error_file": "~/test/processmon/logs/processmon.log",
"log_date_format" : "YYYY-MM-DD HH:mm:ss"
}
]
}
Который я, в свою очередь, использую в pm2 start ./pm2_config.json
. Я не уверен, почему он перезапускается снова и снова - я не знаю, связано ли это с самим кодом или с конфигурацией pm2. Логи pm2 не показывают ошибок, только ожидаемый вывод из кода. Все, что я хочу, это чтобы он запускался раз в час, и я знаю, что могу сделать это с помощью pm2 cron. Однако, прежде чем я это реализую, мне нужно разрешить этот постоянный перезапуск. Это возможно?