前段时间我需要编写 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 运行,尝试通过 bash 脚本运行 kill 或 pkill 的不同方式,调用 system("name_of_script.sh"),其中包含脚本kill -9 *filename*
但结果相同。
使用kill
and/bin/kill
也给出了相同的输出bash -c kill...
。从我的系统(Ubuntu Natty)
使用gnome-terminal: kill
kill -9 `ps aux | grep filename | awk {'print $2'}`
关闭所有必要的进程!它有效。
使用时pkill
,据我所知,我们需要完整的进程名称来杀死它,但我只有部分名称。
我还尝试使用 pthreads 将计算进程包装到子线程中并使用 pthread_cancel 停止它,但它不起作用,因为 CAE 系统进程不接收信号(我认为,捕获它们),唯一的方法是 SIGTERM。
用 pthread_kill 杀死子线程“wrap”也会杀死父线程(我的主程序)。
我不知道从 Signals.h 调用 kill 的
CAE 进程 pid
关闭主程序不会停止 CAE 进程(并且没有 -Z 标志,所以它们不是我的程序进程子进程吗??)
如何关闭从我的主程序运行 > MAXTIME 的 CAE 进程?
问题是我正在通过 QtCreator 中的调试器(gdb)运行主程序。如果没有 QtCreator shell-script 以正确的方式运行参数,尽管参数以两种方式正确传递。
此外,我必须清除一些 CAE 进程,它们在 cmdline 中没有文件名,但它们是该进程的父进程或子进程。在 shell 脚本中,您可以使用:
cat /proc/"$P"/status | grep PPid | grep -o "[0-9]*"
where$P
是一个带有被杀死进程的 pid 的变量。
这里有几种杀死所有子进程的方法。
我会写smth。在 C++ 中类似,它将扫描/proc/xxxx/status
直到PPid
= ppid_of_my main_program 并切断该分支。