Monit 和 shell python脚本 的使用

简介: Monit 和 shell python脚本 的使用

python脚本基本写法

import os, time, sys
f = open('/home/hikari/MonitTest/pid/mypython.pid', 'w')
f.writelines(str(os.getpid()))
f.close()
for i in range(1,99999):
        print ("Hello World!")
        time.sleep(1)
~
import sys, os, time, s
ignal
mypid = 0
mypath = "/home/hikari/Learn/pid/mypython.pid"
if len(sys.argv) >1 :
        if sys.argv[1] == "start":
                f = open(mypath,'w')
                mypid = os.getpid()
                print (mypid)
                f.write(str(mypid))
                f.close()
                for i in range(1,100000):
                        print("Hello World")
                        time.sleep(2)
        if sys.argv[1] == "stop":
                if os.path.exists(mypath):
                        f = open(mypath,'r')
                        mypid = int(f.read())
                        f.close()
                        os.kill(mypid,signal.SIGKILL)
                        os.remove(mypath)

shell 脚本

PIDFILE=/var/run/scraper.pid
case $1 in
   start)
       source /home
       # Launch your program as a detached process
       python /home/scraper.py 2>/dev/null &
       # Get its PID and store it
       echo $! > ${PIDFILE} 
   ;;
   stop)
      kill `cat ${PIDFILE}`
      # Now that it's killed, don't forget to remove the PID file
      rm ${PIDFILE}
   ;;
   *)
      echo "usage: scraper {start|stop}" ;;
esac
exit 0

总结出来的一个稳定版本

monit 控制文件

check process shellXpython matching "/home/hikari/Learn/python/test.sh"
  start program = "/home/hikari/Learn/python/test.sh"
  stop program = "/home/hikari/Learn/sh/kill.sh"

tesh.sh

{
  #在shell内新建一个后台进程
  python /home/hikari/Learn/python/test.py start 
} &
#正常退出
exit 0


kill.sh

#!/bin/sh
pidfile=/home/hikari/Learn/pid/mypy.pid
kill `cat ${pidfile}`
exit 0

test.py

负责模拟一个长期运行的后台进程


import sys, os, time, signal
mypid = 0
mypath = "/home/hikari/Learn/pid/mypy.pid"
if len(sys.argv) >1 :
  if sys.argv[1] == "start":
  f = open(mypath,'w')
  mypid = os.getpid()
  print(mypid)
  f.write(str(mypid))
  f.close()
  for i in range(1,10000):
    print(i)
    time.sleep(2)
  if sys.argv[1] == "stop":
  if os.path.exists(mypath):
    f = open(mypath,'r')
    mypid = int(f.read())
    f.close()
    os.kill(mypid,signal.SIGKILL)
    os.remove(mypath)
time.sleep(99)

改进-myscript.sh

将test.sh 和 kill.sh 合并,通过输入不同参数决定调用对象。


PIDFILE=/var/run/myscript.pid
case $1 in
   start)
       source /home
       # Launch your program as a detached process
       python /home/hikari/Learn/python/test.py start 2>/dev/null &
       # 2>/dev/null 的含义是把标准错误输出到/dev/null文件中
       # Get its PID and store it
       echo $! > ${PIDFILE} 
   ;;
   stop)
      kill `cat ${PIDFILE}`
      # Now that it's killed, don't forget to remove the PID file
      rm ${PIDFILE}
   ;;
   *)
      echo "usage: myscript {start|stop}" ;;
esac
exit 0

关于program 与process的选择

在选择check服务时,process和program代表两种不同的程序。

process代表长时间工作的后台进程,在check process服务中可以接pidfile或matching,而matching可以选择文件路径。process中不能使用status。

program代表短时间内可以执行结束的程序或脚本,status只能与program配对。其原因是status是隔一段指定时间检测程序的退出值,根据退出值采取不同行动。而process要长期运行,故status属性不适用process。

program必须是短时间内可以结束的,否则一段时间后检测不到退出值,将报Execute Failed错误。原因就是程序没有结束,status检测不到程序退出值,以为程序执行失败。

据此,要在program内执行长进程要采用并发进程。假设并发进程为A,令program进程调用并发进程A & 后,立即退出,就可以达到需求。在A后面加&的效果是使A在后台运行。

至此program在短时间内得到了退出值,而长进程A也可以继续执行。


相关文章
|
23天前
|
弹性计算 Shell Perl
ecs服务器shell常用脚本练习(二)
【4月更文挑战第1天】shell代码训练(二)
106 1
|
26天前
|
Java Shell
SpringBoot启动脚本Shell
SpringBoot启动脚本Shell
17 0
|
26天前
|
Linux Shell Python
Linux执行Python脚本
Linux执行Python脚本
26 1
|
3天前
|
Java 关系型数据库 MySQL
Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
【4月更文挑战第12天】Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
28 3
|
6天前
|
运维 监控 Shell
利用Shell脚本编写局域网监控软件:实时监测主机连接情况
本文介绍了如何使用Shell脚本创建一个局域网监控工具,以实时检查主机连接状态。脚本包括扫描IP地址范围检测主机可达性及使用`netstat`监控ESTABLISHED连接。此外,还展示了如何每60秒将连接数数据自动提交到指定网站API,以便实时跟踪网络活动。这个自动化监控系统有助于提升网络安全性和故障排查效率。
26 0
|
7天前
|
Shell
Shell脚本之流程控制语句
Shell脚本之流程控制语句
|
8天前
|
JSON 运维 监控
训练shell常用脚本练习(三)
【4月更文挑战第14天】shell代码训练(三)
27 1
|
12天前
|
存储 弹性计算 Shell
ecs服务器shell常用脚本练习(十)
【4月更文挑战第11天】shell代码训练(十)
143 0
|
12天前
|
弹性计算 Shell Go
ecs服务器shell常用脚本练习(九)
【4月更文挑战第10天】shell代码训练(八)
136 0
|
15天前
|
JSON 测试技术 持续交付
自动化测试与脚本编写:Python实践指南
【4月更文挑战第9天】本文探讨了Python在自动化测试中的应用,强调其作为热门选择的原因。Python拥有丰富的测试框架(如unittest、pytest、nose)以支持自动化测试,简化测试用例的编写与维护。示例展示了使用unittest进行单元测试的基本步骤。此外,Python还适用于集成测试、系统测试等,提供模拟外部系统行为的工具。在脚本编写实践中,Python的灵活语法和强大库(如os、shutil、sqlite3、json)助力执行复杂测试任务。同时,Python支持并发、分布式执行及与Jenkins、Travis CI等持续集成工具的集成,提升测试效率和质量。