windows下,如何使用python捕获到主进程被杀死

go_Michael 2015-01-25 06:32:58
windows下开发,想用python来管理进程。主进程中fork出子进程,并且管理子进程的pid,在主进程被杀掉时,利用信号函数,子进程一同杀死。这个需求在linux下比较容易,现在不知道如何使用windows来完成,比如在windows命令行没有kill命令,而是taskkill命令,那么如何让主进程捕获到taskkill这个命令,从而在主进程挂掉的同时,结束子进程,或者如何在通过任务管理器杀死主进程时,同时结束子进程。
...全文
369 点赞 收藏 19
写回复
19 条回复
go_Michael 2015年01月28日
引用 18 楼 jiht594 的回复:
任务管理器调用的是TerminateProcess()关闭进程. taskkill不知道是不是 搜索"hook TerminateProcess OpenProcess", 可以监控TerminateProcess函数是否要杀掉自己.并且可以阻止被杀 当发现有人调用TerminateProcess杀死自己时,先杀死子进程, 然后不阻止TerminateProcess函数 --------------------------------------- windows API
搜了下感觉还是合适的内容,难道windows下很难实现这种方法吗,有没有别的方法在进程死掉时,做一些善后处理
回复 点赞
jiht594 2015年01月27日
任务管理器调用的是TerminateProcess()关闭进程. taskkill不知道是不是 搜索"hook TerminateProcess OpenProcess", 可以监控TerminateProcess函数是否要杀掉自己.并且可以阻止被杀 当发现有人调用TerminateProcess杀死自己时,先杀死子进程, 然后不阻止TerminateProcess函数 --------------------------------------- windows API
回复 点赞
乔巴好萌 2015年01月27日
默认是父进程退了 子进程就会退的 你的子进程不能退 又是第三方的模块 所以我猜里面有创建daemon进程的步骤 也就是说你调用的subprocess可能里面自己会fork一次 然后这样脱离出你的父进程管理
回复 点赞
go_Michael 2015年01月27日
引用 15 楼 openXMPP 的回复:
[quote=引用 11 楼 go_Michael 的回复:] [quote=引用 9 楼 openXMPP 的回复:] https://pypi.python.org/pypi/psutil 这里有个psutil包 你装下 所谓轮训 就是你在子进程里 新开一个线程 做类似下面的操作 from psutil import Process parentProcess = Process(pid) while True: if False == parentProcess.is_running(): pass # kill other process time.sleep(1)
这个是说子进程开启线程,扫描父进程是否存在,当父进程不存在时,结束子进程的任务交给了子进程本身。 但是这里的子进程是第三方的可执行程序,没办法把类似代码嵌入进去,想来想去不知道windows环境怎样才能在父进程被杀掉时,同时结束子进程。[/quote] 那你主进程为啥不能fork 2次呢 一个fork出来是子进程 再fork一个出来做monitor[/quote] 这样的话会使进程数太多了吧,我的想法是让主进程来管理子进程的生死,这样只要在主进程挂掉时,做一步操作就可以了,但是目前看来没什么好的办法实现这种方式
回复 点赞
乔巴好萌 2015年01月27日
引用 11 楼 go_Michael 的回复:
[quote=引用 9 楼 openXMPP 的回复:] https://pypi.python.org/pypi/psutil 这里有个psutil包 你装下 所谓轮训 就是你在子进程里 新开一个线程 做类似下面的操作 from psutil import Process parentProcess = Process(pid) while True: if False == parentProcess.is_running(): pass # kill other process time.sleep(1)
这个是说子进程开启线程,扫描父进程是否存在,当父进程不存在时,结束子进程的任务交给了子进程本身。 但是这里的子进程是第三方的可执行程序,没办法把类似代码嵌入进去,想来想去不知道windows环境怎样才能在父进程被杀掉时,同时结束子进程。[/quote] 那你主进程为啥不能fork 2次呢 一个fork出来是子进程 再fork一个出来做monitor
回复 点赞
黑泡泡选手 2015年01月27日
我记得可以防止任务管理器kill掉你的进程,你可以搜一下相关的API看看!windows sdk查阅一下相关的内容!
回复 点赞
go_Michael 2015年01月27日
引用 12 楼 Worcy_kiddy 的回复:
父进程是你自己编写的,那第三方的可执行程序怎么算是这个父进程的子进程呢? 一般来说父进程应该是管理子进程的,由父进程(Main Process) fork出N多子进程(Work Process),当父进程接收到消息后,再分配给子进程去处理。如果你的父进程拦截不了kill的消息,那怎么去结束子进程呢?
是啊,我一开始的问题就是这一点,不知道windows中taskkill和任务管理器杀死进程时,通过的是什么机制
回复 点赞
黑泡泡选手 2015年01月27日
父进程是你自己编写的,那第三方的可执行程序怎么算是这个父进程的子进程呢? 一般来说父进程应该是管理子进程的,由父进程(Main Process) fork出N多子进程(Work Process),当父进程接收到消息后,再分配给子进程去处理。如果你的父进程拦截不了kill的消息,那怎么去结束子进程呢?
回复 点赞
go_Michael 2015年01月27日
引用 9 楼 openXMPP 的回复:
https://pypi.python.org/pypi/psutil 这里有个psutil包 你装下 所谓轮训 就是你在子进程里 新开一个线程 做类似下面的操作 from psutil import Process parentProcess = Process(pid) while True: if False == parentProcess.is_running(): pass # kill other process time.sleep(1)
这个是说子进程开启线程,扫描父进程是否存在,当父进程不存在时,结束子进程的任务交给了子进程本身。 但是这里的子进程是第三方的可执行程序,没办法把类似代码嵌入进去,想来想去不知道windows环境怎样才能在父进程被杀掉时,同时结束子进程。
回复 点赞
jiht594 2015年01月27日
子进程不可以自杀吗 子进程定时检查父进程还在不在, 不在了就自杀
回复 点赞
乔巴好萌 2015年01月27日
https://pypi.python.org/pypi/psutil 这里有个psutil包 你装下 所谓轮训 就是你在子进程里 新开一个线程 做类似下面的操作 from psutil import Process parentProcess = Process(pid) while True: if False == parentProcess.is_running(): pass # kill other process time.sleep(1)
回复 点赞
go_Michael 2015年01月27日
引用 7 楼 openXMPP 的回复:
[quote=引用 6 楼 go_Michael 的回复:] [quote=引用 5 楼 Worcy_kiddy 的回复:] windows也有信号处理吧?杀死进程时,进程会获取kill的signal,然后进行一些善后的操作!

// Use signal to attach a signal handler to the abort routine
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <tchar.h>

void SignalHandler(int signal)
{
    printf("Application aborting...\n");
}

int main()
{
    typedef void (*SignalHandlerPointer)(int);

    SignalHandlerPointer previousHandler;
    previousHandler = signal(SIGABRT, SignalHandler);
    
    abort();
}

// Signal types
#define SIGINT      2       // interrupt
#define SIGILL       4       // illegal instruction - invalid function image
#define SIGFPE     8       // floating point exception
#define SIGSEGV     11      // segment violation
#define SIGTERM      5       // Software termination signal from kill
#define SIGBREAK   21      //Ctrl-Break sequence
#define SIGABRT      22      // abnormal termination triggered by abort call(Abort)
我用python试了下,commandline下可以用contrl-C模拟,但是没办法在进程自然死亡或者taskkill,任务管理器杀死进程捕获[/quote] 信号量有好多种, 你在linux下 用kill -l可以看到 其中有些是无法被进程捕捉到的 比如 kill -9, Ctrl+C我记得应该是SIGINT 这个是比较容易捕捉到的 所以你最好的办法是启动一个线程 由这个线程定时做轮训[/quote] 不太明白启动一个线程进行轮训,要做哪些处理? 目前能够获取到主进程产生的子进程的pid,想在主进程退出,或者被taskkill命令杀死,或者被任务管理器结束进程时一并将这些子进程杀死。
回复 点赞
乔巴好萌 2015年01月27日
引用 6 楼 go_Michael 的回复:
[quote=引用 5 楼 Worcy_kiddy 的回复:] windows也有信号处理吧?杀死进程时,进程会获取kill的signal,然后进行一些善后的操作!

// Use signal to attach a signal handler to the abort routine
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <tchar.h>

void SignalHandler(int signal)
{
    printf("Application aborting...\n");
}

int main()
{
    typedef void (*SignalHandlerPointer)(int);

    SignalHandlerPointer previousHandler;
    previousHandler = signal(SIGABRT, SignalHandler);
    
    abort();
}

// Signal types
#define SIGINT      2       // interrupt
#define SIGILL       4       // illegal instruction - invalid function image
#define SIGFPE     8       // floating point exception
#define SIGSEGV     11      // segment violation
#define SIGTERM      5       // Software termination signal from kill
#define SIGBREAK   21      //Ctrl-Break sequence
#define SIGABRT      22      // abnormal termination triggered by abort call(Abort)
我用python试了下,commandline下可以用contrl-C模拟,但是没办法在进程自然死亡或者taskkill,任务管理器杀死进程捕获[/quote] 信号量有好多种, 你在linux下 用kill -l可以看到 其中有些是无法被进程捕捉到的 比如 kill -9, Ctrl+C我记得应该是SIGINT 这个是比较容易捕捉到的 所以你最好的办法是启动一个线程 由这个线程定时做轮训
回复 点赞
go_Michael 2015年01月26日
引用 5 楼 Worcy_kiddy 的回复:
windows也有信号处理吧?杀死进程时,进程会获取kill的signal,然后进行一些善后的操作!

// Use signal to attach a signal handler to the abort routine
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <tchar.h>

void SignalHandler(int signal)
{
    printf("Application aborting...\n");
}

int main()
{
    typedef void (*SignalHandlerPointer)(int);

    SignalHandlerPointer previousHandler;
    previousHandler = signal(SIGABRT, SignalHandler);
    
    abort();
}

// Signal types
#define SIGINT      2       // interrupt
#define SIGILL       4       // illegal instruction - invalid function image
#define SIGFPE     8       // floating point exception
#define SIGSEGV     11      // segment violation
#define SIGTERM      5       // Software termination signal from kill
#define SIGBREAK   21      //Ctrl-Break sequence
#define SIGABRT      22      // abnormal termination triggered by abort call(Abort)
我用python试了下,commandline下可以用contrl-C模拟,但是没办法在进程自然死亡或者taskkill,任务管理器杀死进程捕获
回复 点赞
黑泡泡选手 2015年01月26日
windows也有信号处理吧?杀死进程时,进程会获取kill的signal,然后进行一些善后的操作!

// Use signal to attach a signal handler to the abort routine
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <tchar.h>

void SignalHandler(int signal)
{
    printf("Application aborting...\n");
}

int main()
{
    typedef void (*SignalHandlerPointer)(int);

    SignalHandlerPointer previousHandler;
    previousHandler = signal(SIGABRT, SignalHandler);
    
    abort();
}

// Signal types
#define SIGINT      2       // interrupt
#define SIGILL       4       // illegal instruction - invalid function image
#define SIGFPE     8       // floating point exception
#define SIGSEGV     11      // segment violation
#define SIGTERM      5       // Software termination signal from kill
#define SIGBREAK   21      //Ctrl-Break sequence
#define SIGABRT      22      // abnormal termination triggered by abort call(Abort)
回复 点赞
go_Michael 2015年01月26日
引用 3 楼 Worcy_kiddy 的回复:
使用tasklist命令,定时监测呢?
定时检测只能知道进程是否还活着,现在是想通过taskkill或者任务管理器将进程杀死时,让进程做一些善后操作,比如将它的子进程一同杀死
回复 点赞
黑泡泡选手 2015年01月26日
使用tasklist命令,定时监测呢?
回复 点赞
go_Michael 2015年01月25日
引用 1 楼 openXMPP 的回复:
在linux下 你怎么保证父进程被kill的时候 你一定能捕获这个信号量? kill -9是无法被进程捕捉到的哦
现在不知道如何在windows下使用python实现这种功能
回复 点赞
乔巴好萌 2015年01月25日
在linux下 你怎么保证父进程被kill的时候 你一定能捕获这个信号量? kill -9是无法被进程捕捉到的哦
回复 点赞
发动态
发帖子
脚本语言(Perl/Python)
创建于2007-08-27

1.5w+

社区成员

3.3w+

社区内容

其他开发语言 脚本语言(Perl ,Python)
社区公告
暂无公告