クローンアイテムがフリーズして削除できません。 cron ジョブは、アプリケーション・システムに対して夜間ジョブを実行するスクリプトを開始します。このスクリプトは、アプリケーション・システムのジョブ・スケジューラーに非同期ジョブをサブミットします。次のタスクに進む前に完了する必要があるいくつかの手順があります。これを制御するために、アプリケーションサーバーの戻りコードをテストします。ジョブの状態が 59 より大きい場合は、まだ実行中です。したがって、次のコード(「getjobstatus」コマンドは使用しませんが、以下のjobstatusに数値を返すと仮定)は次のようになります。
jobstatus=0
while [[ $jobstatus -lt 60 ]]
do
sleep 5
jobstatus=`getstatus whatever`
done
「スリープ」プロセスを終了しようとしましたが、再び発生し続けます。どのように予防し、永久に削除できますか?
答え1
コメントでDeathgripが述べたように、親プロセスを終了する必要があり、いくつかのバリエーションを見つけることsleep
ができますps | grep sleep
(ps
実装が多いため、提供するフラグが何であるか、出力がどのように見えるかを正確に推測することはできません。確認man ps
)。
どうなりますか?これを殺すsleep
と終了しますが、埋め込みスクリプトの実行には影響しません。ただ次の行に移動し、ループが繰り返されます。睡眠を終了するためにスクリプトを変更する方法はいくつかあります。最も簡単な方法の1つは、次のことですsleep 5 || exit
。
または、Bash(その他?)を使用している場合は、始めに次の行を追加できますset -e
。これは、コマンドが失敗した場合(つまり、ゼロ以外の状態を返す場合)、Bashにスクリプトを終了するように指示します。ただし、これはスクリプトのすべてに影響を与え、他の多くのトラップがあるため、この回避策は避けるのが最善です。 (set -e
寝る前に行を追加してset +e
すぐに無効にすることもできますが、私が言及した最初の解決策しか使用できないため、これは少し面白いです。)
答え2
プロセスが存在し、スリープsleep
プロセスがループで実行される親シェルスクリプトの一部である場合(たとえば)、対応する(特定の)スリープコマンドが実行されないように、親プロセスを終了する必要があります。再起動しました。
眠っているプロセスのPIDを取得し、親プロセスを見つけて終了します。
$ ps -e -opid,comm,args|grep sleep
424241 sleep sleep 999 # for example
$ ps -oppid= -p SLEEP-PID-HERE-SUCH-AS-424241-ABOVE
424242 # for example
$ kill $(ps -oppid= -p SLEEP-PID-HERE-SUCH-AS-424241-ABOVE)
答え3
私はあなたが次のようなことをしたいと思います: ターミナルでbashスクリプトの繰り返しを停止する方法は?
したがって、あなたの場合、INTの代わりにSIGTERMを使用するとcron操作なので、ctrl + Cの代わりに「kill」を使用して終了しようとしているとします。
jobstatus=0
trap "exit" SIGTERM
while [[ $jobstatus -lt 60 ]]
do
sleep 5
jobstatus=`getstatus whatever`
done
sleepコマンドだけでなく、スクリプト全体を終了できる必要があります。
単純なコメントではなく、別の回答で作成して申し訳ありません。まだコメントできるポイントが足りません。