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

go_Michael 2015-01-25 06:32:58
windows下开发,想用python来管理进程。主进程中fork出子进程,并且管理子进程的pid,在主进程被杀掉时,利用信号函数,子进程一同杀死。这个需求在linux下比较容易,现在不知道如何使用windows来完成,比如在windows命令行没有kill命令,而是taskkill命令,那么如何让主进程捕获到taskkill这个命令,从而在主进程挂掉的同时,结束子进程,或者如何在通过任务管理器杀死主进程时,同时结束子进程。
...全文
990 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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是无法被进程捕捉到的哦

37,743

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧