2017-10-22 20 views
1

flockを使用して、一度に1つのスクリプトインスタンスしか実行できないようにしています。ほとんどの場合、これはうまくいくようです。しかし、私がログアウトすると(私はi3wmを使用します)、またはPCがリブートされると、ロックは解放されません。次回のログイン時にはロックファイルが存在し、新しいロックを取得できないためにスクリプトが開始されません。ログアウト/再起動時にflockが解放されない

ご覧のとおり、私はすでにtrapでプロセスの終了時にロックを解除しようとしましたが、それは役に立ちません。

私はflockを間違って使用していますか、他に何か不足していますか?プロセスが終了するとロックが解除されるべきだという印象を受けていたので、ログアウト/再起動が必要になります。

LOCK_FILE="${HOME}/.my_script.lock" 

release_lock() { 
    # This shouldn't be necessary but it seems 
    # the lock doesn't release on i3 exit 
    rm "${LOCK_FILE}" 
} 


(
    if [[ -n $LOGFILE ]]; then 
     exec >>"$LOGFILE" 2>&1 
    fi 

    flock -xn 200 || { show_message "$(basename ${0}): cannot acquire lock ${LOCK_FILE}"; exit 3; } 
    trap release_lock EXIT 

    # Call the main function (not included in this snippet) 
    main 200>&- 
) 200>"${LOCK_FILE}" 

答えて

2

ファイルを削除しないでください。ファイルを保持しているプロセスを終了させます。

(
    if [[ -n $LOGFILE ]]; then 
     exec >>"$LOGFILE" 2>&1 
    fi 

    flock -xn 200 || { show_message "$(basename ${0}): cannot acquire lock ${LOCK_FILE}"; exit 3; } 

    main 
) 200>"${LOCK_FILE}" 

mainが存在

$LOCK_FILEも同様に終了します、そしてロックがドロップされる開放サブシェル。

ロックを明示的に解除する場合は、ファイルを削除する代わりにflock --unlock 200を使用してください。

+0

答えてくれてありがとう、私は実際にログアウト時にロックを解除するためにtrap/release_lockが必要だと思われますが、 '--unlock'を使うと正しくロックを再設定しているようです。私はこの質問を "回答"に設定する前にこれをテストします。 – rje

関連する問題