Killallは時々失敗します。

Killallは時々失敗します。

こんにちは、以下は「processName」プロセスのすべてのインスタンスを終了するように設計されたスクリプトですが、時にはプロセスを終了せず、同じプロセスの2つのインスタンスが表示された場合にこれが発生しないようにする方法です。

  #!/bin/sh


    pidof processName
    if [ $? -eq 0 ]
    then
       killall processName
       # give processName time to quit
       sleep 3

       pidof processName
       if [ $? -eq 0 ]
       then
          killall -9 processName
       fi
    fi

exit 0

答え1

コマンドラインとプロセス名によって異なります。人々はしばしば2つを混同し、プログラムが表示されなければならないと思うコンテンツを表示したり削除したりしない理由を疑問に思います。また、名前を変更するプロセスやプロセスを置き換えると、トレースが困難になる可能性があります。

あなたのプログラムにPIDファイルがないとします。一部の人は、2つのプロセス(たとえば、異なる構成ファイルを使用してテストおよび開発)を実行したい場合があります。これは、実際にプロセスを追跡するための最良の方法です。また、アプローチでは、プロセス名がプロジェクトに固有であると仮定します。

必要なタスクにはプロセス名のみを提供し、pidofについて心配する必要がないため、pkillがより適しています。 pidofの問題は、一致するプロセスが複数あり、単一の整数が必要な場合にスクリプトが破損する可能性があることです。また、pkill を使用する場合はロジックが同じであるため、pgrep を使用してください。

それは次のとおりです。

#!/bin/sh

pkill processName
pgrep processName
if [ $? -eq 0 ]
then
  sleep 3
  pkill -9 processName
fi

答え2

名前でプロセスを終了する必要がある場合は、pkillが別の代替コマンドになります。

pkill "プロセス名"

関連情報