Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to kill process in c++, knowing only part of its name

Some time ago I needed to write c++ code to kill some process. In my main program I run large CAE-system package with system("...") with different filename strings on input. CAE-software creates many processes, that contain in process name string filename). Some of the CAE-processes worktime > max_time, than I need to shut them down:

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

The output was:

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.

I tried to run with execvp, tried different ways running kill or pkill over bash script, calling system("name_of_script.sh"), where script contained kill -9 *filename* but the result was the same.
Using kill and /bin/kill gave the same output, bash -c kill... too.
Using kill from my system (Ubuntu Natty) gnome-terminal:

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

shutdown all necessary processes! It works.

When using pkill, as I could understand, we need full process name to kill it, but I have only part of name.

I also tried to wrap computational process into a child thread using pthreads and stop it with pthread_cancel, but it doesn't work because of CAE-system process doesn't receive signals (I think, trapping them), the only way is SIGTERM.
Killing child-thread-"wrap" with pthread_kill also kills the parent (my main program).

I don't know CAE-process pids to call kill from signals.h
Closing main program do not stop CAE-processes (and the do not have -Z flag, so are they aren't my program process childs??)

How can I close CAE-processes, that run > MAXTIME from my main program?


The problem was that I was running main program via debugger (gdb) in QtCreator. Without QtCreator shell-script runs with arguments the right way, though arguments are passed correctly both ways.


Also I have to clear some CAE processes, that don't have filename in cmdline, but that are parents or children of this process. In shell-script you can use:

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

where $P is a variable with pid of killed process. Here are several methods to kill all child processes.

I'll write smth. similar in C++ that will scan /proc/xxxx/status till PPid= ppid_of_my main_program and cut that branch.

like image 429
John_West Avatar asked Dec 06 '22 12:12

John_West


1 Answers

You don't have to open a shell to kill a process. Just use the "kill" function:

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

int kill(pid_t pid, int sig);

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

To find a process to kill read the following directory:

/proc/####/cmdline

Where #### is the number of any running process id. So the code roughly would be to read the /proc directory and list out all the numerical directories, these are the current running processes, and you find the name of the command that spawned that process in the "cmdline" file in that directory. You can then use a regular expression, or a string comparison to identify processes to kill.

like image 162
Rafael Baptista Avatar answered Dec 09 '22 15:12

Rafael Baptista