#!/usr/bin/env python3 import json import threading import time import os import logging from flask import Flask import paramiko ssh_infos = json.loads(os.environ.get("SSH_INFOS")) logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') app = Flask(__name__) @app.route('/') def hello(): return "200" success_count = 0 def restore_pm2_processes(info): ssh = None global success_count transport = paramiko.Transport((info['host'], info['port'])) try: transport.connect(username=info['username'], password=info['password']) ssh = paramiko.SSHClient() ssh._transport = transport try: stdin, stdout, stderr = ssh.exec_command('devil info account | grep -o "[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\} [0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}"') logging.info("exp: " + stdout.read().decode()) stdout.channel.recv_exit_status() stdin, stdout, stderr = ssh.exec_command('top -b -n 1') logging.info("top: " + stdout.read().decode()) stdout.channel.recv_exit_status() stdin, stdout, stderr = ssh.exec_command('/home/' + info['username'] + '/.npm-global/bin/pm2 resurrect') logging.info("pm2: " + stdout.read().decode()) if stderr is not None: logging.error("pm2 err: " + stderr.read().decode()) stdout.channel.recv_exit_status() if stdout.channel.exit_status == 0: logging.info("pm2 finish") success_count += 1 else: logging.error("pm2 error" + stderr.read().decode()) except Exception as e: logging.error(f"ssh error: {e}") finally: if ssh is not None: ssh.close() transport.close() def run_cron(): while True: global success_count success_count = 0 for ssh_info in ssh_infos: try: restore_pm2_processes(ssh_info) except Exception as e: logging.error(f"ssh error: {e}") continue logging.info(f"should:{len(ssh_infos)}") logging.info(f"succ:{success_count}") time.sleep(1800) def run_web(): app.run(debug=False, host='0.0.0.0', port=7860) if __name__ == '__main__': schedule_thread = threading.Thread(target=run_web) schedule_thread.start() run_cron()