[英]How to kill process in c++, knowing only part of its name
前段时间我需要编写c ++代码来杀死某些进程。 在我的主程序中,我使用系统(“...”)运行大型CAE系统包,输入时使用不同的文件名字符串。 CAE软件创建许多进程,包含进程名称字符串filename )。 一些CAE流程工作时间 > 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运行,试过不同的方式运行kill或pkill over bash脚本 ,调用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杀死子线程 - “换行”也会杀死父(我的主程序)。
我不知道从 signal.h调用kill的 CAE进程pids
关闭主程序不会停止CAE进程(并且没有-Z标志,所以它们不是我的程序进程子进程吗?)
如何关闭从主程序运行> MAXTIME的CAE进程?
问题是我在QtCreator中通过调试器(gdb)运行主程序。 没有QtCreator shell脚本以正确的方式运行参数,尽管参数都是双向正确传递的。
此外,我必须清除一些CAE进程,这些进程在cmdline中没有文件名,但是这个进程的父项或子项。 在shell脚本中,您可以使用:
cat /proc/"$P"/status | grep PPid | grep -o "[0-9]*"
其中$P
是一个带有已杀死进程的pid的变量。 以下是几种杀死所有子进程的方法。
我会写smth。 类似于C ++,将扫描/proc/xxxx/status
直到PPid
= ppid_of_my main_program并切断该分支。
您不必打开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”文件中找到生成该进程的命令的名称。 然后,您可以使用正则表达式或字符串比较来标识要杀死的进程。
这应该只是假设文件名不是太多异国情调或包含正则表达式模式:
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());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.