unix 如何在c++中杀死进程,只知道其名称的一部分

x7rlezfr  于 2023-04-20  发布在  Unix
关注(0)|答案(2)|浏览(205)

一段时间前,我需要写c++代码杀死一些进程。在我的主程序中,我运行大型CAE系统包,系统(“...”)输入不同的文件名字符串。CAE软件创建了许多进程,包含进程名称字符串 filename)。一些CAE进程 worktimemax_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将计算进程 Package 到子线程中,并使用pthread_cancel停止它,但它不起作用,因为CAE系统进程不接收信号(我认为,捕获它们),唯一的方法是SIGTERM。
用pthread_kill杀死child-thread-“wrap”也会杀死父线程(我的主程序)。
我不知道要调用kill from signals.h的CAE进程pid
关闭主程序不会停止CAE进程(并且没有-Z标志,所以它们不是我的程序进程查尔兹吗?)
我如何才能关闭CAE进程,运行〉MAXTIME从我的主程序?

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

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

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

其中$P是一个变量,其pid为killed进程。Here are several methods用于杀死所有子进程。
我将在C++中编写smth. similar,它将扫描/proc/xxxx/status直到PPid = ppid_of_my main_program,并切断该分支。

i7uaboj4

i7uaboj41#

你不需要打开shell来杀死一个进程。只需要使用“kill”函数:

#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”文件中找到生成该进程的命令的名称。然后您可以使用正则表达式或字符串比较来识别要杀死的进程。

mfpqipee

mfpqipee2#

假设文件名不是很奇怪或者包含正则表达式模式,这应该可以工作:

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());

相关问题