Cronjobで実行するシェルスクリプトがあります。このシェルスクリプトは、実行中のプロセスを強制終了し、新しいプロセスを再開する必要があります。
スクリプトを手動で実行すると完全に正常に動作しますが、cronを介して実行すると、古いプロセスが強制終了されることはなく、古いプロセスとともに新しいプロセスが開始されます。
以下のコード行を使用してプロセスを強制終了しています:
-9 psを殺す| grep "server1" | grep -v grep | awk '{print $ 1}'
あなたは何を殺すかを示さなければなりません:
kill -9 $(ps | grep "server1" | grep -v grep | awk '{ print $1 }')
あなたはトリックを使うこともできます:
kill -9 $(ps | grep "server[1]" | awk '{ print $1 }')
purestの形式では、
pkill server1
これは、server1
が実際にはプロセス名であり、コマンドラインのどこかにあるとは限りません。それ以外の場合は、-f
を追加します。
pkill -f server1CommandArgument
でも待ってください!
pkill
が一致するものをテストして、コマンドpgrep
でkillできます-これは技術的にはほとんど同じです。違いは、それを殺す代わりにPIDを出力するです。
これらを試してください-一致するPIDをリストします。
pgrep server1
-l
は、PIDだけでなくプロセス名もリストします。
pgrep -l server1
-f
コマンドラインに一致、名前だけでなく:
pgrep -fl server1
pgrep
に一致するプロセスを強制終了する場合は、-l
を省略して、デフォルトのSIGTERM以外のものが必要な場合は、信号を追加します。-15
:
pkill -9 server1
例では、デフォルトで現在の端末のプロセスのみに一致する単純なps
コマンドを使用しているため、pgrep
とpkill
は一致しないため、コマンドで一致するものに注意してください現在の端末のプロセスのみを照合します。
kill -9
を使用する際の注意事項-これは殺すための最も激しい方法;です。 実際に必要ですか?
殺したプログラムの種類によっては、問題にならない場合もあります。ただし、データファイルを保存したり、ロックファイルを書き込んだりする可能性のあるプログラム/サーバーに対しては、正当な理由なしにこれを行うべきではありません。プログラムがひどくハングしない限り、デフォルトの信号を使用してkill
-15
はそうします。
シェルスクリプト内では、sh
もスキップする必要があります。以下のコマンドは私のために働きました。
ps -aef | grep $1 | grep -v sh| grep -v grep| awk '{print $2}'
脚本:
#!/bin/bash
var=`ps -aef | grep $1 | grep -v sh| grep -v grep| awk '{print $2}'`
if [ !-z "$var"]
then
echo $1 process is not running
else
kill -9 $var
echo $1 process killed forcefully, process id $var.
fi
参照: シェルスクリプトでのLinuxプロセスの強制終了 は、詳細な説明について記事に目を通すことができます。