Python2.7 signal

    在liunx系统中要想每隔一分钟执行一个命令,最普遍的方法就是crontab了,如果不想使用crontab,经同事指点在程序中可以用定时器实现这种功能,于是就开始摸索了,发现需要一些信号的知识...

查看你的linux支持哪些信号:kill -l 即可

root@server:~# kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9	 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14	51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9	56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6	 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX	
root@server:~#
    信号:进程之间通讯的方式,是一种软件中断。一个进程一旦接收到信号就会打断原来的程序执行流程来处理信号。操作系统规定了进程收到信号以后的默认行为,但是,我们可以通过绑定信号处理函数来修改进程收到信号以后的行为,有两个信号是不可更改的SIGTOP和SIGKILL。

发送信号一般有两种原因:
    1(被动式)  内核检测到一个系统事件.例如子进程退出会像父进程发送SIGCHLD信号.键盘按下control+c会发送SIGINT信号
    2(主动式)  通过系统调用kill来向指定进程发送信号

   在C语言中有个setitimer函数,函数setitimer可以提供三种定时器,它们相互独立,任意一个定时完成都将发送定时信号到进程,并且自动重新计时。参数which确定了定时器的类型:

ITIMER_REAL       定时真实时间,与alarm类型相同。              SIGALRM
ITIMER_VIRT       定时进程在用户态下的实际执行时间。            SIGVTALRM
ITIMER_PROF       定时进程在用户态和核心态下的实际执行时间。      SIGPROF
  这三种定时器定时完成时给进程发送的信号各不相同,其中ITIMER_REAL类定时器发送SIGALRM信号,ITIMER_VIRT类定时器发送SIGVTALRM信号,ITIMER_REAL类定时器发送SIGPROF信号。

  函数alarm本质上设置的是低精确、非重载的ITIMER_REAL类定时器,它只能精确到秒,并且每次设置只能产生一次定时。函数setitimer设置的定时器则不同,它们不但可以计时到微妙(理论上),还能自动循环定时。在一个Unix进程中,不能同时使用alarm和ITIMER_REAL类定时器。

    SIGINT    终止进程     中断进程  (control+c)
    SIGTERM   终止进程     软件终止信号
    SIGKILL   终止进程     杀死进程
    SIGALRM   闹钟信号

前期的知识也准备的差不多了,该向python的signal进军了。

signal模块的异常:

exception signal.ItimerError
    获取在执行setitimer()和getitimer()时的异常错误。

signal模块定义的方法:

signal.alarm(time)
    如果time是个非0的值,则函数会请求SIGALRM信号在经过time秒之后发送到进程。如果time是0值,则alarm不会被调度。
signal.getsignal(signalnum)
    针对signalnum返回当前的信号句柄。
signal.pause()
    设置一个进程到休眠状态直到一个信号唤醒他。
signal.setitimer(which, seconds[, interval])
    设置一个时间计时器,在经过seconds时间后触发which(signal.ITIMER_REAL, signal.ITIMER_VIRTUAL or signal.ITIMER_PROF),并且以后每隔interval时间进行轮训。interval设置为0表示清除which。
经过interval时间后,一个信号会被发送给进程,发送信号的时间依赖于timer的设置。
signal.getitimer(which)
    返回一个当前which指定的interval时间。
signal.set_wakeup_fd(fd)
    设置唤醒一个fd,当收到相关信号后,
signal.siginterrupt(signalnum, flag)
    改变默认的系统调用行为,如果flag设置为False,当收到中断信号后,系统调用会被重新启动。
signal.signal(signalnum, handler)
    设置一个信号给function handler

下面举个简单的例子,每5秒钟收集一次网卡的流量信息

#!/usr/bin/python
import time
import signal
import psutil


def GetNetwork(num,_):
    for keys in psutil.network_io_counters(pernic=True):
        if keys == 'em1':
            print psutil.network_io_counters(pernic=True)[keys][0],psutil.network_io_counters(pernic=True)[keys][1]

    print 'NOW time is: %s' % time.time()

signal.signal(signal.SIGALRM,GetNetwork)
signal.setitimer(signal.ITIMER_REAL,1,5)

while True:
    pass
效果如下:



转载于:https://my.oschina.net/guol/blog/136036

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值