シェルスクリプトでcronを介して実行中のプロセスを終了するには?

シェルスクリプトでcronを介して実行中のプロセスを終了するには?

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現在の端末のプロセスのみに一致する一般的なコマンドを使用しているため、コマンドがどのようなものに一致するかに注意する必要があります。なぜなら、pgreppkillは現在の端末のプロセスだけが一致しないからです。


使用法に関する注意事項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プロセスを強制終了します。完全な説明については、記事を読んでください。

関連情報