我有一个由shell启动并由shell终止的应用程序。现在,在我的应用程序中,我创建了一个fork来减少应用程序的负载,因此当前有两个进程在同一个名称上运行,具有不同的PID。现在我想终止我的程序,如果我在shell中使用我的进程的PID杀死它只会杀死父进程,将其保留为僵尸进程并保留子进程。那么如何通过shell杀死子进程和父进程?
答案 0 :(得分:2)
请参阅命令killall
。
答案 1 :(得分:2)
执行ps -el
您将获得以下内容
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
让您的流程pid
和ppid
执行pkill -P <parent_pid_name>
,这意味着您的父进程ID已生成子级,后跟kill <signal number> <pid>
,在这种情况下也代替{ {1}}您必须提供已生成所有子项的父进程ID。
答案 2 :(得分:1)
你的父进程应该在退出之前捕获SIGTERM并杀死它的子进程。
我是用C
写的int child;
void sighandler(int sig) {
if (sig == SIGTERM) {
if (child != -1) kill(child, SIGTERM);
}
}
int main() {
int i;
child = -1;
signal(SIGCHLD, SIG_IGN);
signal(SIGTERM, sighandler);
setsid();
setpgid(0,0);
i = fork();
switch(i) {
case -1:
break;
case 0: // child
sleep (100);
break;
default:
child = i;
sleep (100);
break;
}
return 0;
}
您可以使用“killall”命令终止具有相同名称的所有进程。
答案 3 :(得分:0)
pkill命令可以用来杀死进程。还有killall