2012-08-13 2 views
4

몇 시간 전 나는 일부 프로세스를 종료하기 위해 C++ 코드를 작성해야했습니다. 내 메인 프로그램에서 나는 입력으로 다른 파일 이름 문자열을 가진 시스템 ("...")으로 대형 CAE 시스템 패키지를 실행한다. CAE 소프트웨어는 프로세스 이름 문자열 에 들어있는 많은 프로세스를 생성합니다. CAE-프로세스 근무 시간의 일부>MAX_TIME, 나는 그들을 종료 할 필요가보다 :,,C++에서 프로세스를 죽이는 방법, 이름의 일부만 알고 있음

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 시도 :

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

출력했다 호출 시스템 ("name_of_script.sh")은 스크립트에 kill -9 *filename*이 포함되어 있지만 결과는 같습니다.
kill/bin/kill을 사용하면 동일한 출력 인 bash -c kill...도 있습니다.

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

종료 필요한 모든 프로세스 : 내 시스템 (우분투 단정) 에서 kill 그놈 터미널를 사용
! 그것은 작품입니다.

pkill을 사용하는 경우 이해할 수있는 것처럼 전체 프로세스 이름이 필요하지만이를 제거하기 위해서는 이름 일부만 사용해야합니다.

또한 pthreads를 사용하여 자식 프로세스로 계산 프로세스를 래핑하려고 시도했지만 pthread_cancel으로 중지하려고 시도했지만 CAE 시스템 프로세스가 신호를받지 못하기 때문에 작동하지 않습니다 (나는 그들을 트래핑한다고 생각합니다). SIGTERM입니다.
pthread_kill로 자식 스레드 - "포장"을 죽이면 부모 (내 주요 프로그램)도 죽입니다.

나는 (? 그래서 그들은 내 프로그램 프로세스 차일 수없는, 그리고이 -Z 플래그가없는) CAE 프로세스의 PID가 CAE-프로세스를 중지하지 않는 메인 프로그램을 닫기 kill from signals.h
전화를 모른다

주 프로그램에서> MAXTIME을 (를) 실행하는 CAE 프로세스를 어떻게 닫을 수 있습니까?


문제

내가 디버거 QtCreator에서 (GDB)를 통해 메인 프로그램을 실행 한 것이 었습니다. QtCreator가 없으면 셸 스크립트는 올바른 방법으로 인수를 사용하여 실행되지만 인수는 올바르게 양방향으로 전달됩니다.


또한 내가있는 CmdLine에 파일 이름이없는 일부 CAE 프로세스를 취소해야하지만 부모 또는이 과정의 자녀가. 쉘 스크립트에서 사용할 수 : $P 살해 프로세스의 PID와 변수입니다

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

. Here are several methods 모든 하위 프로세스를 종료합니다.

나는 쓸데없이 쓸 것입니다. C++에서 /proc/xxxx/statusPPid = ppid_of_my main_program까지 스캔하고 해당 분기를 잘라냅니다.

+1

이러한 프로세스가 프로그램에서 만드는 프로세스입니까? pid를 기억하고 그런 식으로 죽이는 것이 훨씬 쉬울 것입니다. – Wug

+1

정말 쉘 대신 C++에서이 작업을 수행 하시겠습니까? – pmr

+0

시스템 ("launcher.sh filename")으로 CAE를 호출합니다. 파일 이름은 매번 다릅니다. 오, 나는 발사기의 PID 만 가져 가면 2 초 만에 완료되고 CAE 프로세스가 생성됩니다. –

답변

11

프로세스를 종료하기 위해 쉘을 열 필요가 없습니다.

은/proc/#### /있는 CmdLine

# : 다음 디렉토리를 읽을 죽일 프로세스를 찾으려면

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

int kill(pid_t pid, int sig); 

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

: 그냥 "죽이는"기능을 사용하여 ###는 실행중인 프로세스 ID의 번호입니다. 따라서 코드는 대략/proc 디렉토리를 읽고 모든 숫자 디렉토리를 나열하는 것이고, 이들은 현재 실행중인 프로세스이며 해당 디렉토리의 "cmdline"파일에서 해당 프로세스를 생성 한 명령의 이름을 찾을 수 있습니다. 그런 다음 정규식이나 문자열 비교를 사용하여 죽일 프로세스를 식별 할 수 있습니다. 은 최후의 수단 신호가 아니라 당신이 시작해야 뭔가, 보조 노트로

string s="pkill -9 -f "+filename"; 
system(s.c_str()); 

:

+2

'/ proc/xxx/cmdline'을 읽으려면 내 대답을 확인하십시오 : http://stackoverflow.com/questions/6898337/c-determine-programmatically-if-a-program-is-running/6898456#6898456 –

+0

!/proc 스캐닝은 좋은 일입니다! 문제는, 내가 알기 론, 프로세스가 gdb 공간에서 시작되었다는 것이 었습니다. –

+0

더 정확함 : QtCreator에서 gdb가 시작되었습니다. –

0

이 그냥 파일 이름을 가정 작동합니다 너무 많은 이국적인하지 않거나 정규 표현식 패턴이 포함되어 있습니다. 따라서 덜 잔인한 것이 좋습니다 :

string s="pkill -f "+filename"+";sleep 2; pkill -9 -f "+filename; 
system(s.c_str()); 
관련 문제