Python之signal模块的使用
常用的信号值如下:
信号值 事件 处理方式
SIGHUP 终止进程 终端线路挂断
SIGINT 终止进程 中断进程
SIGQUIT "建立CORE文件终止进程,并且生成core文件"
SIGILL 建立CORE文件 非法指令
SIGTRAP 建立CORE文件 跟踪自陷
SIGBUS 建立CORE文件 总线错误
SIGSEGV 建立CORE文件 段非法错误
SIGFPE 建立CORE文件 浮点异常
SIGIOT 建立CORE文件 执行I/O自陷
SIGKILL 终止进程 杀死进程
SIGPIPE 终止进程 向一个没有读进程的管道写数据
SIGALARM 终止进程 计时器到时
SIGTERM 终止进程 软件终止信号
SIGSTOP 停止进程 非终端来的停止信号
SIGTSTP 停止进程 终端来的停止信号
SIGCONT 忽略信号 继续执行一个停止的进程
SIGURG 忽略信号 I/O紧急信号
SIGIO 忽略信号 描述符上可以进行I/O
SIGCHLD 忽略信号 当子进程停止或退出时通知父进程
SIGTTOU 停止进程 后台进程写终端
SIGTTIN 停止进程 后台进程读终端
SIGXGPU 终止进程 CPU时限超时
SIGXFSZ 终止进程 文件长度过长
SIGWINCH 忽略信号 窗口大小发生变化
SIGPROF 终止进程 统计分布图用计时器到时
SIGUSR1 终止进程 用户定义信号1
SIGUSR2 终止进程 用户定义信号2
SIGVTALRM 终止进程 虚拟计时器到时
1、接收信号绑定处理对应的事件
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import signal
import os
import time def receive_signal(signum, stack):
"""用于接收信号,对signum的值区分信号,实现不同的信号做对应的处理"""
print('接收的signum', signum) #注册处理信号的事件,此处对用户定义信号1、用户定义信号2,绑定事件
signal.signal(signal.SIGUSR1, receive_signal)
signal.signal(signal.SIGUSR2, receive_signal) print('我的PID: %s' % os.getpid()) #开启循环监听信号
while True:
print('Waiting...')
time.sleep(3)
signal_signal.py
运行效果
#终端1
[root@ mnt]# python3 signal_signal.py
我的PID:
Waiting... #==>每3秒打印一次
Waiting...
Waiting...
接收的signum 10 #==>接收到kill -USR1 14718的命令,作出的动作
Waiting...
接收的signum 12 #==>接收到kill -USR2 14718的命令,作出的动作
Waiting...
Waiting...
Traceback (most recent call last): #==>接收到kill -INT 14718命令的动作
File "signal_signal.py", line , in <module>
time.sleep()
KeyboardInterrupt #终端2
[root@ ~]# kill -USR1
[root@ ~]# kill -USR2
[root@ ~]# kill -INT
2、获取已注册信号处理器事件
#!/usr/bin/env python
# -*- coding: utf-8 -*- import signal def alarm_received(n, stack):
return signal.signal(signal.SIGALRM, alarm_received) # 字典格式:{<Signals.SIGABRT: 6>: 'SIGIOT', <Signals.SIGALRM: 14>: 'SIGALRM'...}
signals_to_names = {
getattr(signal, n): n
for n in dir(signal) if n.startswith('SIG') and '_' not in n
} for s, name in sorted(signals_to_names.items()):
handler = signal.getsignal(s) # 获取信号的有没有绑定信号事件
if handler is signal.SIG_DFL: # 判断有没有绑定信号事件,没有的话,设置为SIG_DFL或SIG_IGN
handler = 'SIG_DFL'
elif handler is signal.SIG_IGN:
handler = 'SIG_IGN'
print('{:<10} ({:2d}):'.format(name, s), handler)
signal_getsignal.py
运行效果
[root@ mnt]# python3 signal_getsignal.py
SIGHUP ( ): SIG_DFL
SIGINT ( ): <built-in function default_int_handler>
SIGQUIT ( ): SIG_DFL
SIGILL ( ): SIG_DFL
SIGTRAP ( ): SIG_DFL
SIGIOT ( ): SIG_DFL
SIGBUS ( ): SIG_DFL
SIGFPE ( ): SIG_DFL
SIGKILL ( ): SIG_DFL
SIGUSR1 (): SIG_DFL
SIGSEGV (): SIG_DFL
SIGUSR2 (): SIG_DFL
SIGPIPE (): SIG_IGN
SIGALRM (): <function alarm_received at 0x7f2bc1002e18>
SIGTERM (): SIG_DFL
SIGCLD (): SIG_DFL
SIGCONT (): SIG_DFL
SIGSTOP (): SIG_DFL
SIGTSTP (): SIG_DFL
SIGTTIN (): SIG_DFL
SIGTTOU (): SIG_DFL
SIGURG (): SIG_DFL
SIGXCPU (): SIG_DFL
SIGXFSZ (): SIG_IGN
SIGVTALRM (): SIG_DFL
SIGPROF (): SIG_DFL
SIGWINCH (): SIG_DFL
SIGPOLL (): SIG_DFL
SIGPWR (): SIG_DFL
SIGSYS (): SIG_DFL
SIGRTMIN (): SIG_DFL
SIGRTMAX (): SIG_DFL
3、发送信号
#!/usr/bin/env python
# -*- coding: utf-8 -*- import os
import signal
import sys
os.kill(int(sys.argv[1]),signal.SIGUSR1)
signal_send.py
4、告警信号
import signal
import time def receive_alarm(signum, stack):
print('告警时间 :', time.ctime()) signal.signal(signal.SIGALRM, receive_alarm)
signal.alarm(2) #2秒后调用SIGALRM信号的事件 print('之前运行时间:', time.ctime())
time.sleep(4)
print('之后运行时间: :', time.ctime())
signal_alarm.py
运行效果
[root@ mnt]# python3 signal_alarm.py
之前运行时间: Thu Dec ::
告警时间 : Thu Dec ::
之后运行时间: : Thu Dec ::
5、怱略信号
import signal
import os def do_exit(sig, stack):
raise SystemExit('Exiting') # 退出程序并打印显示 # 注册使用SIGINT发送信号,做忽略处理
signal.signal(signal.SIGINT, signal.SIG_IGN) # 注册使用SIGUSR1发送信号,交给do_exit函数处理
signal.signal(signal.SIGUSR1, do_exit) print('我的PID: %s' % os.getpid()) signal.pause() # 暂停
signal_ignore.py
运行效果
#终端1
#Ctrl+C,失效,因为Ctrl+C发送的信号是SIGINT,已经被怱略
[root@ mnt]# python3 signal_ignore.py
我的PID:
^C^C^C^C^C^C^C #终端2
#方法1、杀死不了进程
[root@ mnt]# kill -INT #方法2、可以杀死进程
[root@ mnt]# kill -USR1
6、开启两个线程相互接收信号
#!/usr/bin/env python
# -*- coding: utf-8 -*- import signal
import threading
import os
import time def signal_handler(num, stack):
print('接收信号 SIG值{} 线程名字{}'.format(num, threading.currentThread().name)) # 给SIGUSR1注册处理事件
signal.signal(signal.SIGUSR1, signal_handler) #等待接收信号
def wait_for_signal():
print('等待信号进来', threading.currentThread().name)
signal.pause()
print('完成等持') # 启动不会接收信号的线程
receiver = threading.Thread(
target=wait_for_signal,
name='receiver',
)
receiver.start()
time.sleep(0.1) #给主进程发送SIGUSR1信号
def send_signal():
print('发送SIGUSR1信号', threading.currentThread().name)
os.kill(os.getpid(), signal.SIGUSR1) sender = threading.Thread(target=send_signal, name='sender')
sender.start()
sender.join() # 等待线程看到信号
print('Waiting for', receiver.name)
signal.alarm(2) #2秒后,发出告警信号,终止程序,如果没有加入此代码,会导致无限阻塞
receiver.join()
signal_threads.py
运行效果
[root@ mnt]# python3 signal_threads.py
等待信号进来 receiver
发送SIGUSR1信号 sender
接收信号 SIG值10 线程名字MainThread
Waiting for receiver
Alarm clock
7、多进程与告警信号配合使用
#!/usr/bin/env python
# -*- coding: utf-8 -*- import signal
import time
import threading def signal_handler(num, stack):
print(time.ctime(), '处理告警的线程名字', threading.currentThread().name) # 注册SIGALRM信号的事件
signal.signal(signal.SIGALRM, signal_handler) def use_alarm():
t_name = threading.currentThread().name
print(time.ctime(), '设置1秒后触发告警', t_name)
signal.alarm(1)
print(time.ctime(), '睡眠3秒', t_name)
time.sleep(3)
print(time.ctime(), '完成睡眠', t_name) # Start a thread that will not receive the signal
alarm_thread = threading.Thread(
target=use_alarm,
name='alarm_thread',
)
alarm_thread.start()
time.sleep(0.1) # Wait for the thread to see the signal (not going to happen!)
print(time.ctime(), '等待执行完成', alarm_thread.name)
alarm_thread.join() print(time.ctime(), '正常退出')
signal_threads_alarm.py
运行效果
[root@ mnt]# python3 signal_threads_alarm.py
Thu Dec :: 设置1秒后触发告警 alarm_thread
Thu Dec :: 睡眠3秒 alarm_thread
Thu Dec :: 等待执行完成 alarm_thread
Thu Dec :: 处理告警的线程名字 MainThread
Thu Dec :: 完成睡眠 alarm_thread
Thu Dec :: 正常退出
Python之signal模块的使用的更多相关文章
- Python 信号处理 signal 模块
Table of Contents 1. signal模块简介 1.1. signal简单示例 1.2. signal说明 1.2.1. 基本的信号名 1.2.2. 常用信号处理函数 2. signa ...
- Python使用signal模块实现定时执行
在liunx系统中要想每隔一分钟执行一个命令,最普遍的方法就是crontab了,如果不想使用crontab,经同事指点在程序中可以用定时器实现这种功能,于是就开始摸索了,发现需要一些信号的知识... ...
- Python之signal模块
http://www.cnblogs.com/dkblog/archive/2011/03/07/1980636.html 1.超时处理 #!/usr/bin/env python2.7 #-*- c ...
- signal模块简介
signal模块简介 最近在看Linux signal 相关内容,signal可以被用来进程间通信和异步处理.Python标准库提供了signal包可以用来处理信号相关.这里讨论的是Unix系统中Py ...
- Python fcntl 与 signal 模块使用
这两个模块是Python标准库里面就包含的模块 用法介绍在 https://docs.python.org/2/library/signal.html https://docs.python.org/ ...
- python标准库介绍——37 signal 模块详解
==signal 模块== 你可以使用 ``signal`` 模块配置你自己的信号处理器 (signal handler), 如 [Example 3-11 #eg-3-11] 所示. 当解释器收到某 ...
- 第四章:4.0 python常用的模块
1.模块.包和相关语法 使用模块好处: 最大的好处是大大提高了代码的可维护性.其次,编写代码不必从零开始.当一个模块编写完毕,就可以被其他地方引用.我们在编写程序的时候,也经常引用其他模块,包括Pyt ...
- python 历险记(五)— python 中的模块
目录 前言 基础 模块化程序设计 模块化有哪些好处? 什么是 python 中的模块? 引入模块有几种方式? 模块的查找顺序 模块中包含执行语句的情况 用 dir() 函数来窥探模块 python 的 ...
- python中os模块中文帮助
python中os模块中文帮助 python中os模块中文帮助文档文章分类:Python编程 python中os模块中文帮助文档 翻译者:butalnd 翻译于2010.1.7——2010.1.8 ...
随机推荐
- 啃掉Hadoop系列笔记(03)-Hadoop运行模式之本地模式
Hadoop的本地模式为Hadoop的默认模式,不需要启用单独进程,直接可以运行,测试和开发时使用. 在<啃掉Hadoop系列笔记(02)-Hadoop运行环境搭建>中若环境搭建成功,则直 ...
- layui 实现图片上传和预览
[学习笔记] 图片不自动上传并在表单提交时再上传,看代码. 附上表单页面 前台实现 <#--图片名--><input id="fileName" type=&qu ...
- 从入门到自闭之Python--虚拟环境如何安装
Windows下创建虚拟环境virtualenv 如果在一台电脑上, 想开发多个不同的项目, 需要用到同一个包的不同版本, 如果使用上面的命令, 在同一个目录下安装或者更新, 新版本会覆盖以前的版 ...
- X86逆向10:学会使用硬件断点
本节课我们将学习硬件断点的使用技巧,硬件断点是由硬件提供给我们的一组寄存器,我们可以对这些硬件寄存器设置相应的值,然后让硬件帮我们断在需要下断点的地址上面,这就是硬件断点,硬件断点依赖于寄存器,这些寄 ...
- 并不对劲的bzoj4945:loj2305:uoj317:p3825[NOI2017]游戏
题目大意 2-SAT,其中有\(d\)(\(d\leq 8\))个点是\(3-SAT\). 题解 枚举\(d\)个点不取三个中(假设三个为\(a,b,c\))的哪一个,然后整体变成做\(2-SAT\) ...
- java正则表达式的使唤
示例代码: package com.target.start; import java.util.regex.Matcher; import java.util.regex.Pattern; /* * ...
- 怎样理解 MVVM ( Model-View-ViewModel ) ?
MVVM 的 产生 / 实现 / 发展 可以写一篇很长的博客了, 这里仅写一下个人对 MVVM的一些肤浅的认识. 1. 在 没有 MVVM 之前, 前端可以说是 jQuery一把梭 , jQuery ...
- 解决windows系统下ping,ipconfig不是内部或外部命令
一般情况下,都是误删了系统变量path的值.解决方法:右击我的电脑 → 选择属性 → 选择高级系统设置 → 环境变量 → 在系统变量列表中,找到“path”环境变量双击,打开.在变量值这一栏检测下是否 ...
- 你不知道的css各类布局(四)之响应式布局
响应式布局 概念 响应式布局指的是同一页面在不同屏幕尺寸下有不同的布局 布局特点 响应式设计的目标是确保一个页面在所有终端上(各种尺寸的PC.手机.手表.冰箱的Web浏览器等等)都能显示出令人满意的效 ...
- 【Git的基本操作六】分支管理
分支管理 1. 什么是分支? 在版本控制过程中,使用对条线同时推进多个任务. 2. 分支的好处 同时并行推进多个功能开发,提高开发效率 各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任 ...