【问题标题】:How to kill a process whose pid keeps changing?如何杀死pid不断变化的进程?
【发布时间】:2012-12-01 00:28:49
【问题描述】:

我知道我可以使用技巧if (fork()) exit(0); 来更改当前进程的 pid。因此,以下程序的 pid 变化非常快。如何杀死这样的进程?有没有比执行大量killall procname 直到能够在它分叉之前运行kill() 更好的方法?我知道这不是一个“进程”,而是许多进程每个运行几微秒。

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

int main()
{
    pid_t self = getpid();
    while (1)
    {
        if (fork()) exit(0);
        if (self + 10000 < getpid()) break; // Just to kill it after some time
        usleep(1000);
    }
    return 0;
}

我发现列出进程的唯一方法是执行ps -A | grep procname 几次,直到显示一些输出。为什么不总是列出进程?

【问题讨论】:

  • 谁会投票结束这个“离题”?我的意思是,说真的,这与编程无关?你们这些人有什么问题让你们如此亲密?是的。
  • 这样写程序有什么实际理由吗?它看起来更像是恶意软件,而不是任何有用的东西。
  • 我还没有(还)否决,但是编程问题究竟是什么?您似乎只是在寻求一种从命令行查找和终止进程的简单方法。
  • 我正在寻找的是了解如何在 linux 环境下杀死这样的进程。我不想真正杀死它,只是了解这个过程。不是一个“简单的方法”命令行。
  • @EdS.:我认为这更像是一个系统管理问题而不是一个编程问题,但由于它涉及到 POSIX 进程和进程组语义的复杂性,我也认为它在这里是相关的,所以我还没有投票结束。

标签: c linux unix process


【解决方案1】:

这样的过程被系统管理员称为“彗星”。

进程组 ID (PGID) 在 fork 上不会更改,因此您可以通过向进程组发送信号来终止它(或 SIGSTOP 它)(您将否定的 PGID 而不是 PID 传递给 @987654322 @)。

【讨论】:

  • 如果它每次都调用setpgid/setsid怎么办? :-)
【解决方案2】:

我能看到您看不到它的唯一原因是尚未创建分叉的孩子,但父母在死亡方面已经取得了足够的进展,因此不再列出。

不幸的是,我认为在没有猜测的情况下杀死这种进程是不可能的。这样做需要提前知道下一个 pid。您可以猜测下一个 pid,但不能确定没有其他 pid 被分配。

【讨论】: