2016-06-21 6 views
-1

私はGoプログラムこれを再起動し、簡単な20行の小さなスクリプトを作成しようとしているが、私がこれまで持っているものです。Bashスクリプトが目的を殺していないか?

#!/bin/bash 
chsum1="" 
pid="" 

while true ; do 
    chsum2=$(find ./ -type f -exec md5 {} \;) 
    if [[ $chsum1 != [[$chsum2 ]] ; then 
    if [[ $pid != "" ]] ; then 
     kill $pid 
    fi 
    go run main.go & 
    pid=$(%%) 
    chsum1=$chsum2 
    echo "RESTARTED" 
    fi 
    sleep 2 
done 

それは動作しますが、それは再起動したときに、私はまだ使用中のポートを取得します。

私はbashの

+3

シャットダウンを求める信号をプロセスに送ります。私は、プロセスが実際に終了するように睡眠を追加しようとするか、 'kill -9'を使用するといいでしょう。 – Richard

+2

2番目の' ['は' if'の中で余分です(そしてもしそれが正しいならば、 '$ chsum2 'の前のスペース)。タイプミスとして閉じる投票。 – tripleee

+1

また、 '$(%%)'は間違っています。あなたは 'pid = $! 'を望んでいるようです。 – tripleee

答えて

0

で多くの経験を持っていないところ、私はここで間違っていたあなたが行にエラー([[あまりにも多く)が100%わからない:

if [[ $chsum1 != [[$chsum2 ]] ; then 

そして用としてのkillシグナル、あなたはgracefull kill(SIGTERM)を送信しているので、アプリケーションはすぐに終了せず、すべてのタスクとシャットダウンを停止しようとしますが、時間がかかることがあります。私は与えられたPIDがまだそこにあるかどうかを確認し、PIDのみ後に再起動を行うだろう小さなループが本当に死んでいるだろう

if [[ $pid != "" ]] ; then 
    kill $pid 
    while ps -p $pid >/dev/null; then 
     sleep 1 
    done 
fi 

上記のコードになるループ永遠に、あなたがしたい場合がありますので、ループの数を制限しようとしてください(例:for i in seq 100を使用)

+0

スリープの代わりに、 'wait'を使うことができます... – anishsane

+0

障害モードによって異なります。もしくさびっている(実行しても結果が出ない)なら、出力を停止するときに再起動すると、(このような動作を引き起こすバグを修正するのは洗練された解決策になりますが)行く方法のようです。 – tripleee

関連する問題