少し前に、プロセスを強制終了するために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
し/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で「ラップ」すると、親(私のメインプログラム)も強制終了されます。
シグナルからkillを呼び出すCAEプロセスpidがわかりません。h
メインプログラムを閉じてもCAEプロセスは停止しません(-Zフラグがないため、プログラムプロセスの子ではありませんか??)
メインプログラムから>MAXTIMEを実行するCAEプロセスを閉じるにはどうすればよいですか?
問題は、QtCreatorのデバッガー(gdb)を介してメインプログラムを実行していたことでした。QtCreatorがないと、シェルスクリプトは引数を使用して正しい方法で実行されますが、引数は両方の方法で正しく渡されます。
また、コマンドラインにファイル名がないが、このプロセスの親または子であるいくつかのCAEプロセスをクリアする必要があります。シェルスクリプトでは、次のものを使用できます。
cat /proc/"$P"/status | grep PPid | grep -o "[0-9]*"
ここ$P
で、は強制終了されたプロセスのpidを持つ変数です。
すべての子プロセスを強制終了するいくつかの方法があります。
smthを書きます。= ppid_of_my main_program/proc/xxxx/status
までスキャンし、そのブランチをカットするC++でも同様です。PPid