2017-10-15 15 views
0

私はbashスクリプトにバックグラウンドで無期限に実行する関数を持っています。これは、同じスクリプトを再実行することによって終了されます。それはスイッチの一種です。私がこのスクリプトを起動すると、起動しているか、既に実行中の場合はその関数を強制終了します。私は複数の実行中のインスタンスと競合状態を回避したいと思い、今PIDファイルをロックする

#!/bin/bash 

background_function() { 
    ... 
} 

if [[ ! -s myscript.pid ]] 
then 
    background_function & 
    echo $! > myscript.pid 
else 
    kill $(cat myscript.pid) && rm myscript.pid 
fi 

:これを行うには、私はPIDファイルを使用します。私は群れを使用しようと、私はこのように上記のコード書き直しました。そうすることで

#!/bin/bash 

background_function() { 
    ... 
} 

exec 200>myscript.pid 
if flock -n 200 
then 
    background_function & 
    echo $! > myscript.pid 
else 
    kill $(cat myscript.pid) && rm myscript.pid 
fi 

を、しかし、私はPIDファイルをロックしているが、私は再びpidファイルをスクリプトを起動するたびに書き換えられますexec 200>myscript.pidとなっており、すでに実行中のインスタンスのPIDを取得できず、終了できません。

どうすればよいですか?私は2つの異なるファイル、pidファイルとロックファイルを使うべきですか?または、mkdirとtouchを使用して他のロック機構を実装する方が良いでしょうか?ありがとう。

答えて

0

echo $$は、あなたが使用することができ、あなたのために十分な原子の場合:

echo $$ >> lock.pid 
lockedby=`head -1 lock.pid` 
if [ $$ != $lockedby ] ; then 
    kill -9 $lockedby 
    echo $$ > lock.pid 
    echo "Murdered $lockedby because it had the lock" 
fi 

# do things in the script 

rm lock.pid 
+0

それは興味深いアプローチであり、それは私のために動作します。トリッキーな部分は、バックグラウンドでプロセスの正しいPID( 'background_function&; echo $!> lock.pid')でPIDファイルを書き換えることです。ありがとうございました! –

関連する問題