cronjobで実行されるシェルスクリプトがあります。シェルスクリプトは実行中のプロセスを終了し、新しいプロセスを再起動する必要があります。
スクリプトを手動で実行すると正常に動作しますが、cronで実行すると古いプロセスは終了せず、古いプロセスと一緒に新しいプロセスが起動します。
プロセスを終了するには、次のコード行を使用しています。
kill -9 ps | grep "server1" | grep -v grep -v awk '{印刷$1}'
答え1
何を殺すかを指定する必要があります。
kill -9 $(ps | grep "server1" | grep -v grep | awk '{ print $1 }')
次のトリックを使用することもできます。
kill -9 $(ps | grep "server[1]" | awk '{ print $1 }')
答え2
内部に最も純粋な利用可能なフォーム
pkill server1
これは、server1
コマンドラインのどこかではなく実際にプロセス名であると仮定します。それ以外の場合-f
。
pkill -f server1CommandArgument
しかし、待って!
あなたはできますpkill
一致する項目のテストそして命令で殺しなさいpgrep
。これは技術的にほぼ同じです。違いは次のとおりです。殺人ではありません。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
答え3
シェルスクリプトでもこれをスキップする必要があります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プロセスを強制終了します。完全な説明については、記事を読んでください。