以下のようにプロセスを終了するためにbashスクリプトにコマンドを追加しました。
#!/bin/bash
kill -9 $(ps ux | grep 'fluent' | awk '{print $2}')
たとえば、スクリプトを実行しても./mykill
効果はありません。
$ ps ux | grep fluent
ko 21690 0.0 0.0 112664 972 pts/3 S+ 15:28 0:00 grep --color=auto fluent
ko 26573 5.1 1.0 1743688 673592 ? Sl May14 836:08 /state/partition1/ans190/v190/fluent/cortex.19.0.0 -f fluent -cmd-port:35881:compute-0-4.local -workbench-session (fluent "3ddp -pshmem -host -alnamd64 -r19.0.0 -t16 -mpi=ibmmpi -path/state/partition1/ansys190/v190/fluent -ssh")
ko 26581 0.0 0.0 0 0 ? Z May14 0:00 [fluent] <defunct>
$
$
$ ~/mykill
Killed
$ ps ux | grep fluent
ko 21690 0.0 0.0 112664 972 pts/3 S+ 15:28 0:00 grep --color=auto fluent
ko 26573 5.1 1.0 1743688 673592 ? Sl May14 836:08 /state/partition1/ans190/v190/fluent/cortex.19.0.0 -f fluent -cmd-port:35881:compute-0-4.local -workbench-session (fluent "3ddp -pshmem -host -alnamd64 -r19.0.0 -t16 -mpi=ibmmpi -path/state/partition1/ansys190/v190/fluent -ssh")
ko 26581 0.0 0.0 0 0 ? Z May14 0:00 [fluent] <defunct>
ただし、端末でコマンドを実行すると、そのコマンドは終了します。
$ kill -9 $(ps ux | grep 'fluent' | awk '{print $2}')
-bash: kill: (21899) - No such process
$ ps ux | grep fluent
ko 21915 0.0 0.0 112664 972 pts/3 S+ 15:31 0:00 grep --color=auto fluent
それでは、なぜですか?
答え1
あなたのアプローチにはいくつかの問題があります。
プロセスを検出する方法は信頼できません。fluent
終了したいプロセスでなくても、プロセスがコマンドラインにある可能性があります。たとえば、スクリプトを呼び出すと、それkill-fluent
自体が終了します。名前だけでプロセスを終了しないでください。。これは本当に信頼できません。
プロセスを終了する最良の方法は、独自のリモート制御メカニズムを使用して終了コマンドを送信することです。可能でない場合は、開いたファイルに基づいて終了します。fuser
。バイナリを実行すると、バイナリを開くと見なされます。たとえば、実行中のすべてのプロセスを終了するには、/usr/bin/fluent
を実行しますfuser -k /usr/bin/fluent
。
コマンドラインに基づいてプロセスを終了する必要がある場合は、使用しないでくださいgrep
。ps … | grep …
grep プロセスを含めることができます。このps
コマンドとこのgrep
コマンドは並列に実行されるため、両方のプロセスの相対速度に応じてps
リストされている場合とそうでない場合があります。grep
始まった。使用pkill
代わりに。
プロセスに関しては<defunct>
それらを殺すことを忘れなさい: 彼らは既に死んでいます。これが「存在しない」という意味です:彼らは存在しますゾンビ。