1.一种办法是在父进程fork出子进程的时候把子进程pid写入一个文件中,这种父进程捕捉到sigkill或者sighup信号的时候读取文件kill 子进程们的pid。
2.还有一种方法就是子进程定时调用os.getppid()来判断是否自己已经成为了僵尸进程,如果是赶紧把事情做完正常结束掉。
第一种方法暴力有效,第二种方法更加安全。
按照unix设计哲学,进程是程序执行的最小单元,而他们是天生平等的,没有父进程权利就大一些就能剥夺子进程的生命周期,父进程没了,init进程就要喜当爹。所以你的问题的重点不在于父进程结束子进程,再于一个进程如何结束另一个进程,从这个角度(ipc)上去探索,方法还是很多的,发挥想象力吧。
用到threading的Timer,也类似单片机那样子,在中断程序中再重置定时器,设置中断,python实例代码如下:
import threading
import time
def change_user():
print('这是中断,切换账号')
t = threading.Timer(3, change_user)
t.start()
#每过3秒切换一次账号
t = threading.Timer(3, change_user)
t.start()
while True:
print('我在爬数据')
time.sleep(1)
扩展资料
有时当一个条件成立的情况下,需要终止程序,可以使用sys.exit()退出程序。sys.exit()会引发一个异常:
1、如果这个异常没有被捕获,那么python编译器将会退出,后面的程序将不会执行。
2、如果这个异常被捕获(try...except...finally),捕获这个异常可以做一些额外的清理工作,后面的程序还会继续执行。
注:0为正常退出,其他数值(1-127)为不正常,可抛异常事件供捕获。另一种终止程序的方法os._exit()
一般情况下使用sys.exit()即可,一般在fork出来的子进程中使用os._exit()
采用sys.exit(0)正常终止程序,程序终止后shell运行不受影响。
采用os._exit(0)关闭整个shell,调用sys._exit(0)后整个shell都重启了(RESTART Shell)。
pro.waitFor()导致当前线程等待,如有必要,一直要等到由该 Process 对象表示的进程已经终止。如果已终止该子进程,此方法立即返回。如果没有终止该子进程,调用的线程将被阻塞,直到退出子进程。
一般都是用一个线程去做处理运行,另一个线程来做管理,
try {
final Process pro = Runtime.getRuntime().exec("notepad.exe")
new Thread(new Runnable() {
public void run() {
try {
pro.waitFor()
System.out.println(1)
pro.destroy()
} catch (InterruptedException e) {
e.printStackTrace()
}
}
}).start()
new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(1000)
pro.destroy()
} catch (InterruptedException e) {
e.printStackTrace()
}
}
}).start()
} catch (IOException e) {
e.printStackTrace()
}
我用的是一个新的线程,一般用主线程去做处理,控制他的关闭。你的另一个其他代码也可以执行。对于cmd这个窗体,就完全没有思路了,java程序是没办法把他关闭掉,应该是dos的权限比java的大吧。