Bashスクリプトの無効なコマンド

Bashスクリプトの無効なコマンド

以下のようにプロセスを終了するために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

コマンドラインに基づいてプロセスを終了する必要がある場合は、使用しないでくださいgrepps … | grep …grep プロセスを含めることができます。このpsコマンドとこのgrepコマンドは並列に実行されるため、両方のプロセスの相対速度に応じてpsリストされている場合とそうでない場合があります。grep始まった。使用pkill代わりに。

プロセスに関しては<defunct>それらを殺すことを忘れなさい: 彼らは既に死んでいます。これが「存在しない」という意味です:彼らは存在しますゾンビ

関連情報