【Linux进阶】-- 1.python脚本实现守护进程daemon调度,启停等

news2024/11/26 16:39:23

"怀斯曼不蒸汽啊"

  • 1. Linux守护进程介绍
    • 1.1 查看进程
  • 2. python指令for linux
    • 2.1 运行shell命令
  • 3. 代码讲解
    • 3.1 创建守护进程文件pre_deal.py
    • 3.2 用脚本运行
    • 3.3 用一个python程序来管理该任务

  • 任务介绍:
    1. 首先python创建文件1,作用是创建一个守护进程,内容是持续输出时间到输出文件中.
    1. 用shell脚本调用该守护进程
    1. 通过python文件2实现对第一个调度任务的启停重启等.(python的管道操作实现)

1. Linux守护进程介绍

  • 普通的进程: 在Linux中,每个系统与用户进行交流的界面成为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端被称为这些进程的控制终端,当控制终端被关闭的时候,相应的进程都会自动关闭。
  • 守护进程: 如果想让某个进程不因为用户或中断或其他变化而影响,那么就必须把这个进程变成一个守护进程。
    用户的登录与注销与守护进程无关系,不受其影响,守护进程自成进程组,自成会话 ,即pid = gid = sid。
  • 守护进程也称精灵进程(Daemon),是运行在后台的一种特殊进程。
  • 独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程。Linux的大多数服务器就是用守护进程实现的。

1.1 查看进程

ps ajx

可以看到如下界面:
在这里插入图片描述在TPGID一列,数值为-1的,均是脱离终端的守护进程

2. python指令for linux

2.1 运行shell命令

os.system(command)
如下代码可以实现效果如同 ls

 import os 
 os.system('ls')

3. 代码讲解

3.1 创建守护进程文件pre_deal.py

daemonize是创建守护一个进程的过程.其中包括:

  1. 在后台运行,调用fork ,然后使父进程exit
  2. 从母体环境脱离,登录会话和进程组,调用setsid()使进程成为会话组长
  3. 重新fork(防止成为僵尸进程)(此时已经是一个守护进程了)
  4. 重定向标准文件符(此时的pritf就已经被定向到了输出文件中)
  5. main函数,就是我们要运行的进程中的任务
#!/usr/bin/env python 
#coding: utf-8 
import sys, os 
 
'''将当前进程fork为一个守护进程 
  注意:如果你的守护进程是由inetd启动的,不要这样做!inetd完成了 
  所有需要做的事情,包括重定向标准文件描述符,需要做的事情只有chdir()和umask()了 
''' 
 
def daemonize (stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'): 
   #重定向标准文件描述符(默认情况下定向到/dev/null) 
  try:  
    pid = os.fork()  
     #父进程(会话组头领进程)退出,这意味着一个非会话组头领进程永远不能重新获得控制终端。 
    if pid > 0: 
      sys.exit(0)  #父进程退出 
  except OSError, e:  
    sys.stderr.write ("fork #1 failed: (%d) %s\n" % (e.errno, e.strerror) ) 
    sys.exit(1) 
 
   #从母体环境脱离 
  os.chdir("/") #chdir确认进程不保持任何目录于使用状态,否则不能umount一个文件系统。也可以改变到对于守护程序运行重要的文件所在目录 
  os.umask(0)  #调用umask(0)以便拥有对于写的任何东西的完全控制,因为有时不知道继承了什么样的umask。 
  os.setsid()  #setsid调用成功后,进程成为新的会话组长和新的进程组长,并与原来的登录会话和进程组脱离。 
 
   #执行第二次fork 
  try:  
    pid = os.fork()  
    if pid > 0: 
      sys.exit(0)  #第二个父进程退出 
  except OSError, e:  
    sys.stderr.write ("fork #2 failed: (%d) %s\n" % (e.errno, e.strerror) ) 
    sys.exit(1) 
 
   #进程已经是守护进程了,重定向标准文件描述符 
 
  for f in sys.stdout, sys.stderr: f.flush() 
  si = open(stdin, 'r') 
  so = open(stdout, 'a+') 
  se = open(stderr, 'a+', 0) 
  os.dup2(si.fileno(), sys.stdin.fileno())  #dup2函数原子化关闭和复制文件描述符 
  os.dup2(so.fileno(), sys.stdout.fileno()) 
  os.dup2(se.fileno(), sys.stderr.fileno()) 
 
#示例函数:每秒打印一个数字和时间戳 
def main(): 
  import time 
  sys.stdout.write('Daemon started with pid %d\n' % os.getpid()) 
  sys.stdout.write('Daemon stdout output\n') 
  sys.stderr.write('Daemon stderr output\n') 
  c = 0 
  while True: 
    sys.stdout.write('%d: %s\n' %(c, time.ctime())) 
    sys.stdout.flush() 
    c = c+1 
    time.sleep(3) 
 
if __name__ == "__main__": 
   daemonize('/dev/null','/tmp/daemon_stdout.log','/tmp/daemon_error.log') 
   main() 
  • 可以通过命令ps -ef | grep pre_deal查看后台运行的这个进程
  • 在/tmp/daemon_error.log会记录错误运行日志
  • 在/tmp/daemon_stdout.log会记录标准输出日志。

此时给该文件权限并执行后.查看进程可以看见一个python且,TPGID为-1的守护进程,输出文件也在输出.

3.2 用脚本运行

比较简单:

 #/bin/bash
./pre_deal.py

3.3 用一个python程序来管理该任务

#! /usr/bin/env python
# -*- coding: utf-8 -*-

import os
import sys
import time
import subprocess

def start():
    os.system("./a")


def stop():
    # count = "ps -ef | grep 'pre_deal' | grep 'bin/' | grep -v 'grep' | wc -l"
    count = "ps -ef | grep 'pre_deal' | grep -v 'grep' | wc -l" #统计有几行任务
    process = subprocess.Popen(count, stdin=None, stdout=subprocess.PIPE,
                               stderr=None, shell=True)
    cnt = process.stdout.read()
    if int(cnt):
        #此时,cmd是逐个第二列的号码,即PID
        cmd = "ps -ef | grep 'pre_deal' | grep -v 'grep' | kill -9 `awk '{print $2}'`"
        subprocess.Popen(cmd, stdin=None, stdout=None, stderr=None, shell=True)
        
    # print "All the platform daemons have been stopped."


if __name__ == "__main__":

    input_idx = input("请输入1: ")
    if input_idx == 1 :
        stop()
        start()
    elif input_idx == 2 :
        start()
    else:
        print("输入错误")
        sys.exit(2)
    sys.exit(0)
  • 基本都是靠python执行shell命令执行,删除操作如下:
  1. 查询pre_deal相关进程,wc -l 统计行数,即统计有几个进程
ps -ef | grep 'pre_deal' | grep -v 'grep' | wc -l
  1. awk...print $2列出第二列的PID,用以杀掉,最后执行kill -9 将这几个与pre_deal有关的进程杀掉,即为关闭
ps -ef | grep 'pre_deal' | grep -v 'grep' | kill -9 `awk '{print $2}'`
  1. 有一种较为科学规范的方法是,每个守护进程在执行的时候,会生成.pid的文件,其中存放的是该守护进程的PID,而当进程结束时,该文件即销毁.然后可以通过该self.pid的存放内容来杀掉该守护进程.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/50206.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

<C++>手撕搜索二叉树

目录 一、搜索二叉树的性质 二、搜索二叉树的结构定义 三、手撕搜索二叉树非递归 1)Insert() 2)Find() 3)Erase() 4)InOder() 5)BSTree(const BSTree& t) 拷贝构造 6)~BSTree()析构函数 四、手…

【学习笔记65】JavaScript的继承

一、认识继承 function Person(name) {this.name name}Person.prototype.sayName () > {console.log(name)}function Stu(age) {this.age age}const s new Stu(18)console.log(s) // {age: 18} 说明: 想让s这个对象内部有一个name属性, 并且可以使用 sayN…

双功能连接试剂:Alkyne hydrazide,炔烃-酰肼 主要特点进行分享

Alkyne hydrazide物理参数: CAS号:N/A |英文名:Alkyne hydrazide | 中文名:炔烃-酰肼 货号:X-CL-1132 分子式:C6H11ClN2O 分子量:162.62 纯度:95% 外形:淡黄色或白…

企业级的商用远程控制软件有哪些

现在远程控制软件,可选性还是比较大的。针对个人用户市场,也有不少免费软件。 企业用户的需求和个人用户的需求,差别较大。个人用户市场,主要诉求是免费、好用。企业用户,主要关注安全、管理功能、性能、价格等因素。…

为什么建议MySQL在2000W条左右记录分表

为什么建议MySQL在2000W条左右记录分表?这个数量问题并不是绝对的,这是一个相对的数量。在回答这个问题前我们应该先了解MySQL底层是用的什么数据结构来进行数据存储的。 MySQL底层采用的B树进行的数据存储 InnoDB存储引擎最小储存单元是页,…

【Java面试】异常常见面试题

文章目录1. Error 和 Exception 区别是什么?运行时异常和一般异常(受检异常)区别是什么?JVM 是如何处理异常的?throw 和 throws 的区别是什么?final、finally、finalize 有什么区别?NoClassDefFoundError 和 ClassNotF…

OpenMP 快速入门

学习《高性能计算:现代系统与应用实践》(Thomas Sterling,Matthew Anderson,Maciej Brodowicz)第 7 章 OpenMP 的基础 OpenMP OpenMP 是一个 API C、C、Fortran OpenMP 是共享内存的多线程编程模型 共享内存 默认所有…

22年11月-自研-面试题

目录背景题目Activiti回退功能条件分支功能,并行网关、包含网关有没有用到流程流转中,需知会其他人,这些人需同意/做处理(有点流程的感觉),最后所有的意见都要汇总。你的实现思路Redis哪些数据结构&#xf…

STM32实战总结:HAL之低功耗

低功耗的含义不必过多解释,一听就能懂。 低功耗对电池供电产品尤其重要。 STM32的有三种低功耗模式,即睡眠模式、停止模式和待机模式。 在我的印象中,停止不就是关机吗?但并不是。 在系统或电源复位以后,微控制器处于运…

基于最小二乘插值(Least-Squares Interpolation)图像超分辨率重构算法研究-附Matlab代码

⭕⭕ 目 录 ⭕⭕✳️ 一、引言✳️ 二、最小二乘图像插值理论与Matlab处理✳️ 三、基于最小二乘插值超分辨重构实验验证✳️ 四、参考文献✳️ 五、Matlab程序获取与验证✳️ 一、引言 图像超分辨率重构技术起源于上世纪60年代Harris和Goodman构造的单帧图像重构方法&#xf…

AutoCAD Electrical 2022—元件的绘制

原理图——图标菜单 选择要插入的元件; 根据实际情况,选择垂直放置还是水平放置,比例大小; 选择一个三极断路器,垂直放置; 点击确定后,点击一根导线,选择断路器另外两个符号是的方向…

相控阵天线(十一):阵列天线有源驻波分析

目录简介有源驻波概念和计算公式平面阵列天线的有源驻波平面阵列有源驻波计算公式平面阵列有源驻波仿真示例不同耦合系数/隔离度的有源驻波分析简介 有源相控阵最大的特点是每一个收发天线后均连接一个独立的T/R组件,每一个T/R组件相当于一个常规雷达的高频前端&am…

【信息检索与数据挖掘期末笔记】(二) IR Evaluation

文章目录测试集无序检索结果集合的评价Precision & RecallAccuarcy?F值有序检索结果评价方法二值相关(相关/不相关)PrecisionK(PK)Mean Average Precision(MAP)Mean Reciprocal Rank多级相关CG&#x…

LeetCode542. 01 矩阵(C++中等题)

题目 给定一个由 0 和 1 组成的矩阵 mat ,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。 两个相邻元素间的距离为 1 。 示例 1: 输入:mat [[0,0,0],[0,1,0],[0,0,0]] 输出:[[…

(三) 共享模型之管程【共享带来的问题】

一、共享带来的问题 1. 临界区 (1)一个程序运行多个线程本身是没有问题的 (2)问题出在多个线程访问共享资源 1️⃣多个线程读共享资源其实也没有问题 2️⃣在多个线程对共享资源读写操作时发送指令交错,就会出现问题 …

git@github.com: Permission denied (publickey).

本地虚拟机ubuntu上安装git,想从github上拉取项目到ubuntu上的过程。 1、在ubuntu上安装git 更新apt指令 sudo apt update 安装git sudo apt install git 查看安装git版本 git --version 2、ssh认证 首先已经安装了ssh指令 先执行 ssh -T gitgithub.com 执行之…

3.11 怎么增加小红书评论区的互动?【玩赚小红书】

今天就为大家总结了一下,关于小红书粉丝互动的一些小技巧,来供大家参考。 ​ ​ 一、 固好“真爱粉” 经常会在笔记下面评论、点赞、浏览笔记内容的粉丝,也就是所谓的“真爱粉”、“铁粉”,我们就需要用心维护这一部分粉丝。 ​…

虹科分享|硬件加密U盘|居家办公的网络安全:远程员工可以采取的步骤

新冠肺炎的流行迫使数以百万计的人在家工作,而当时他们对这一概念知之甚少,甚至完全没有经验。虽然许多员工已经重返办公室,但最近的一项研究发现,72%的受访者希望每周至少有两天在家工作,32%的人表示他们希望永久在家…

全波形反演的深度学习方法: 第 4 章 基于正演的 FWI (草稿)

本章论述经典的 FWI, 它基于正演方法. 本贴仅供内部培训. 4.1 FWI 问题 图 4.1 FWI 的输入与输出 [1].图 4.2 FWI 的数学式子.正演问题是建立从速度模型到地震数据的映射. 一般认为是单解的, 即一个速度模型只能生成一个地震数据 (如果不考虑噪声).反演问题是建立从地震数据到…

【题解】E. Sending a Sequence Over the Network(1741)

链接:https://codeforces.com/problemset/problem/1741/E 题目大意 给出一个数组,判断它是否是合法的,如果合法则输出YES,不合法则输出NO。 合法规则:一段序列中,这个序列的第一个或者最后一个的数值&…