2012-06-26 14 views
7

私はすべてのX秒でアプリケーションを実行する必要があります。つまり、cronがこのように秒で動作しない限り、私は無限ループでX秒のスリープを持つbashスクリプトを作成しました。bashスクリプトの無限ループをうまく止めるには?

実行中のスクリプトを手動で停止する必要がある場合、正しい方法で実行したいと思います。アプリケーションが正常に機能し、次回ループを開始しないようにしてください。

これはどのように達成できますか? 引数を渡すことを考えましたが、実行中のスクリプトに引数を渡す方法が見つかりませんでした。

答えて

22

あなたは可能性がトラップ信号は、SIGUSR1を言う:

echo "My pid is: $$" 
finish=0 
trap 'finish=1' SIGUSR1 

while ((finish != 1)) 
do 
    stuff 
    sleep 42 
done 

その後、あなたは次の反復でループを終了したいとき:

pidはのプロセスIDです
kill -SIGUSR1 pid 

スクリプト。スリープ中に信号が立ち上がると、スリープ状態になります(信号が発生するまでスリープ状態になります)。

+0

ありがとう:)この作品 –

2

ファイルによって引数を渡すことができます。各繰り返しで、このファイルを読み、実行中の条件が変更されたかどうかを確認することができます。

1

とにかくクリーンアップを行う必要がある場合は、次の構造が適切な場合があります。 cdarkeの答えに示されているようにkillを使用してください。

#=============================================================== 
# FUNCTION DEFINITIONS 
#=============================================================== 
# . . . 

#=== FUNCTION ================================================ 
#   NAME: cleanup 
# DESCRIPTION: 
#=============================================================== 
cleanup() 
{ 
    # wait for active children, remove empty logfile, ..., exit 
    exit 0 
} # ---------- end of function cleanup ---------- 

#=============================================================== 
# TRAPS 
#=============================================================== 
trap cleanup SIGUSR1 

#=============================================================== 
# MAIN SCRIPT 
#=============================================================== 
echo -e "Script '$0'/PID ${$}" 

while : ; do        # infinite loop 
    # . . . 
    sleep 10 
done 
# . . . 

#=============================================================== 
# STATISTICS/CLEANUP 
#=============================================================== 
cleanup 
0

以前に投稿されたトラップソリューションは、大きなループには適していますが、1つまたはいくつかのコマンドをループしている一般的なケースでは面倒です。この場合、私は、次の解決策をお勧めします。コマンドは、それが中断された場合どうなるのゼロ以外の終了コードを、持っている場合

while whatever; do 
    command || break 
done 

これは、ループを終了します。したがって、commandSIGINTを処理しない限り、ctrl-Cを押すと現在のコマンドが停止し、ループが終了します。

編集:あなたの質問をより詳しく読んだ後で、現在のコマンドを実行し続けたいと思っています。その場合、この解決策は適用されません。

関連する問題