【问题标题】:How to kill process in c++, knowing only part of its name如何在 C++ 中杀死进程,只知道其名称的一部分
【发布时间】:2012-08-09 15:54:10
【问题描述】:

前段时间,我需要编写 C++ 代码来杀死某个进程。在我的主程序中,我运行带有 system("...") 的大型 CAE 系统包,输入时带有不同的文件名字符串。 CAE 软件创建了许多进程,其中包含进程名称字符串 filename)。一些 CAE 进程 worktime > max_time,比我需要关闭它们:

//filename contains part of CAE-process name
    string s="/bin/kill -9 `ps aux | grep "+filename+" | awk {'print $2'}`";
    system(s.c_str());

输出是:

Usage:
  kill pid ...              Send SIGTERM to every process listed.
  kill signal pid ...       Send a signal to every process listed.
  kill -s signal pid ...    Send a signal to every process listed.
  kill -l                   List all signal names.
  kill -L                   List all signal names in a nice table.
  kill -l signal            Convert between signal numbers and names.

我尝试使用 execvp 运行,尝试使用 different ways running kill or pkill over bash script,调用 system("name_of_script.sh"),其中脚本包含 kill -9 *filename*,但结果相同。
使用 kill/bin/kill 得到相同的输出,bash -c kill... 也是。
在我的系统中使用 kill (Ubuntu Natty) gnome-terminal

kill -9 `ps aux | grep filename | awk {'print $2'}`

关闭所有必要的进程!它有效

当使用pkill时,据我所知,我们需要完整的进程名称来杀死它,但我只有部分名称。

我还尝试使用 pthreads 将计算进程包装到子线程中并使用 pthread_cancel 停止它,但它不起作用,因为 CAE 系统进程不接收信号(我认为,捕获它们),这是唯一的方法是 SIGTERM。
用 pthread_kill 杀死子线程“wrap”也会杀死父线程(我的主程序)。

我不知道要调用 kill from signals.h 的 CAE 进程 pid
关闭主程序不会停止 CAE 进程(并且没有 -Z 标志,所以它们不是我的程序进程子进程吗??)

如何关闭从我的主程序运行 > MAXTIME 的 CAE 进程?


问题是我在 QtCreator 中通过调试器 (gdb) 运行主程序。如果没有 QtCreator shell-script 以正确的方式运行参数,尽管参数以两种方式正确传递。


我还必须清除一些 CAE 进程,这些进程在 cmdline 中没有文件名,但它们是该进程的父进程或子进程。 在 shell 脚本中,您可以使用:

cat /proc/"$P"/status | grep PPid | grep -o "[0-9]*"

其中$P 是一个带有被杀死进程的pid 的变量。 Here are several methods 杀死所有子进程。

我会写的。在 C++ 中类似,它将扫描 /proc/xxxx/status 直到 PPid= ppid_of_my main_program 并剪切该分支。

【问题讨论】:

  • 这些流程是您从程序中创建的吗?记住 pid 并以这种方式杀死它们会容易得多。
  • 你确定你真的想用 C++ 而不是 shell 来做这个吗?
  • 我用 system("launcher.sh filename");文件名每次都不同。哦,我只能获取启动器的 pid,它会在两秒钟内完成并创建 CAE 进程。
  • Shell 也是受欢迎的。我可以使用 system("script.sh"); 调用脚本其中 scripts.sh 包含 #/bin/bash kill -9 `ps aux | grep $1 | awk {'print $2'}` 没有运行(同样的错误:用法:kill...)
  • system("script.sh filename") 当然。

标签: c++ linux unix process kill


【解决方案1】:

您不必打开 shell 来终止进程。只需使用“杀死”功能:

#include <sys/types.h>
#include <signal.h>

int kill(pid_t pid, int sig);

http://linux.die.net/man/2/kill

要找到要杀死的进程,请阅读以下目录:

/proc/####/cmdline

其中#### 是任何正在运行的进程ID 的编号。因此代码大致是读取 /proc 目录并列出所有数字目录,这些是当前正在运行的进程,您可以在该目录的“cmdline”文件中找到生成该进程的命令的名称。然后,您可以使用正则表达式或字符串比较来识别要终止的进程。

【讨论】:

  • 要阅读/proc/xxx/cmdline,请在此处查看我的答案:stackoverflow.com/questions/6898337/…
  • 谢谢! /proc 扫描是件好事!虽然据我了解,问题是进程是在 gdb 空间启动的。
【解决方案2】:

这应该只是假设文件名不是太奇特或包含正则表达式模式:

string s="pkill -9 -f "+filename";
system(s.c_str());

作为旁注,-9 是最后的信号,不是你应该开始的。因此,我会推荐不那么残酷的:

string s="pkill -f "+filename"+";sleep 2; pkill -9 -f "+filename;
system(s.c_str());

【讨论】:

    猜你喜欢
    • 2013-01-15
    • 2023-03-12
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 2011-02-25
    • 2011-06-19
    • 1970-01-01
    相关资源
    最近更新 更多