2016-06-27 5 views
0

すべてのアクティブなプロセスをフェッチして強制終了するスクリプトがあります。 しかし、私は以下のエラーを取得しています何らかの理由:キルコマンドがエラーを起こしています

:: INFO :: /AA/AAA/AAA/AAA/AAA/AAA/AAA/AAA \ Servers.sh :: 2016から06 -26:04:00:04:プロセス FORCEのKILLING残りのサーバー

:: INFO :: /AA/AAA/AAA/AAA/AAA/AAA/AAA/AAA \ Servers.sh :: 2016- 06-26:04:00:04:force_stop_managed_servers kill:usage \:kill [-s sigspec | -n signum | -sigspec] pid | ジョブ仕様...または-l [sigspeの\ cを]殺す

私のスクリプトは、プロセスをkill強制するには、以下の機能を持っています。

function force_stop_managed_servers() { 

     printf "\n\n:: INFO :: $0 :: `date +%Y-%m-%d:%H:%M:%S` :force_stop_managed_servers called" 
     cd $SCRIPT_DIR 
     kill -9 $(ps -ef | grep SONARPOTY | grep $USER | grep -v "grep" | grep -v "StopManagedServers" | grep -v "controller"| awk '{ print $2 }') 
     printf "\n\n:: INFO :: $0 :: `date +%Y-%m-%d:%H:%M:%S` :force_stop_managed_servers done" 
} 

なぜこのエラーが発生するのか教えてください。

+0

'set -x'で試してみてください。おそらく、' kill'が間違って呼ばれることがあります。 (また、http://www.shellcheck.netには他にもいくつかの潜在的なエラーがあることがわかります) – Biffen

+0

'$ USER'が空でないかどうか、そしてbigコマンドの結果として返されるpidが1つだけであることを確認してください。 – Fazlin

+0

@Fazlin:長いコマンドは単一のプロセスIDを返しません。複数のプロセスが返されます。複数のプロセスが返され、それを克服するための解決策がある場合は、何が欠点であるかをお聞かせください。 –

答えて

0

このエラーは、 'kill -9'コマンドが引数なしで呼び出された場合に発生します。長い行コマンドを実行し、出力を変数に割り当てることができます。後でその変数が空でないことを確認し、その変数をkillコマンドの引数として渡します。

0

procpsパッケージは、util-linux-ngパッケージとgrepを組み合わせたものよりも、プロセス選択の処理と選択されたプロセスへの信号送信に優れています。

grepを使用するスクリプトでは、プロセスの一覧からプロセスIDを選択するのが一般的です。どちらの場合は名前patternあるプロセスのPIDを印刷する

pgrep pattern 

ps -ef | grep pattern | grep -v grep | awk '{print $2}' 

しかし、これはに短縮することができます。 ただし、1つの注意点があります.2番目のバージョンはプロセス名とのパターンにのみ一致します。ユーザーが所有するプロセスの検索を制限する

pgrep -f pattern 

:コマンドの引数にマッチする必要がある場合 次のようなものが必要。一部の試みはgrepユーザ名になります。 pgreppsは両方とも-u usernameを受け入れ、ユーザー名が所有するプロセスのみを一覧表示します。代わりに、書き込みの

ps -ef | grep username | grep -v grep | awk '{print $2}' 

試してください:あなたはこれらの選択PID Sを殺すために必要がある場合は

pgrep -u username 

、あなたは結果に対してkillを実行する必要はありません。 pgrepの代わりにpkillを使用するだけです。あなたは本当にあなたが持つかもしれない何らかの理由でpskillを使用することに限定されている場合は

pkill -u username pattern 

は、psは、フォーマットされた出力を可能にします。あなたはgrepPIDそのものを誤って取得することなく、この方法でgrepパターンを使用することができます。

kill -9 $(ps -u username -opid=.comm= | grep pattern | awk '{print $1}') 

kill $()を使用しての唯一の欠点は、$()が空に返すことが、あなたはあなたが得るエラーメッセージが表示されますということです。ソリューションは、/dev/nullにエラーメッセージを投げることです。 pkillは殺害するものがない場合でも文句を言うことはありません。

最後に、コマンド自体ではなくコマンド引数と照合する必要がある場合は、コマンドを出力する代わりに引数を出力するには-opid=,args=を使用します。

関連する問題