前段时间我需要编写C++代码来杀死一些进程。在我的主程序中,我使用带有不同文件名字符串的系统(“...”)运行大型CAE系统程序包。 CAE软件创建了许多进程,其中包含进程名称字符串,文件名为)。一些CAE流程工作时间的>MAX_TIME,比我更需要关闭它们:如何在C++中杀死进程,只知道其名称的一部分
//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,调用系统(“name_of_script.sh”),其中脚本包含kill -9 *filename*
,但结果相同。
使用kill
和/bin/kill
也给出了相同的输出bash -c kill...
。
使用kill
从我的系统(Ubuntu的纳蒂)GNOME终端:
kill -9 `ps aux | grep filename | awk {'print $2'}`
关闭所有必要的过程!它作品。
使用pkill
时,据我所知,我们需要完整的进程名称来杀死它,但我只有部分名称。
我也尝试使用pthreads将计算进程包装到子线程中,并使用pthread_cancel将其停止,但由于CAE-系统进程没有收到信号(我认为将其捕获)方式是SIGTERM。
用pthread_kill杀死子线程“换行”也杀死父母(我的主程序)。
我不知道CAE进程的PID调用kill from signals.h
关闭主程序不停止CAE流程(和没有-Z标志,所以是他们不是我的程序处理孩子的?)
如何关闭从我的主程序运行MAXTIME的CAE进程?
的问题是,我是运行经由调试器(GDB)在QtCreator主程序。如果没有QtCreator shell脚本以正确的方式运行参数,虽然参数可以通过两种方式正确传递。
此外,我必须清除一些CAE过程,没有文件名中的cmdline,但有父母或这个过程的儿童。 在shell脚本可以使用:
cat /proc/"$P"/status | grep PPid | grep -o "[0-9]*"
其中$P
是杀进程的PID的变量。 Here are several methods杀死所有子进程。
我会写smth。在C++中类似,它将扫描/proc/xxxx/status
直到PPid
= ppid_of_my main_program并剪切该分支。
这些流程是从您的程序创建的吗?记住pid并以这种方式杀死它们会容易得多。 – Wug 2012-08-13 12:07:41
你确定你真的想在C++而不是shell中做到这一点吗? – pmr 2012-08-13 12:08:08
我用系统调用CAE(“launcher.sh文件名”);文件名每次都不相同。哦,我只能拿起发射器的pid,在两秒钟内完成并创建CAE进程。 – 2012-08-13 12:09:31