【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
虽然软件开发的时候,我们总是希望软件不要发生bug、不要有闪退、甚至于说不要有内存泄漏,但这也只是我们自己的一厢情愿而已。只要前方有需求,软件功能在不停地迭代和优化,那么就势必会引入新的bug,这是不可避免的。因此,以防万一,我们一般会在软件开发的时候编写一个关联的监控进程,防止发生程序闪退的现象。
1、编写测试代码hello.c
首先我们编写一个测试代码hello.c,内容如下所示
#include <stdio.h>
#include <unistd.h>int main()
{while(1){printf("hello, world\n");sleep(1);}return 0;
}
2、编译测试代码
有了代码之后,我们简单用gcc工具编译一下,
gcc hello.c -g -o hello
3、准备监控进程run.py
脚本的内容比较简单,首先它启动hello程序。等到启动之后,它就会定时检查一下程序还在不在,如果在,一切ok。如果不在的话,那么就需要重启一下进程。
import subprocess
import timedef start_program():process = subprocess.Popen(["/home/feixiaoxing/Desktop/monitor/hello"])return processdef monitor_program(process):while True:if process.poll() is not None:print("Program exited, restarting...")process = start_program()time.sleep(1)if __name__ == "__main__":program_process = start_program()monitor_program(program_process)
4、测试和验证
有了可执行程序hello,有了监控程序run.py,接下来就可以开始测试了。测试过程中,原本闪退的部分,我们可以通过ps aux | grep hello找到pid之后、并且kill的方法来模拟闪退。观察闪退之后hello程序的打印是不是还正常。如果正常,代表我们的设计是有效果的;反之,则代表还需要check一下失败的原因是什么,回头重新改进一下。
feixiaoxing@raspberrypi:~/Desktop/monitor $ python3 run.py
hello, world
hello, world
hello, world
hello, world
hello, world
hello, world
hello, world
hello, world
hello, world
hello, world
hello, world
hello, world
hello, world
hello, world
Program exited, restarting...
hello, world
hello, world
hello, world
hello, world
hello, world
通过打印,我们发现run.py启动之后,是一直有打印的。这个时候,我们通过另外一路ssh登录到树莓派上,找到hello并且kill -9 hello之后,这个时候run.py也发现hello不见了,所以重新启动了程序。这就是整个监控的基本原理。最后给出kill hello的方法,
feixiaoxing@raspberrypi:~/Desktop $ ps aux | grep hello
feixiao+ 2197 0.0 0.0 2192 1024 pts/0 S+ 23:32 0:00 /home/feixiaoxing/Desktop/monitor/hello
feixiao+ 2199 0.0 0.0 6088 1920 pts/1 S+ 23:32 0:00 grep --color=auto hello