Prevent repeated shell script execution

Source: Internet
Author: User

The lock mechanism allows a specific shell script to run only one instance at a time. Specifically, the script instance for obtaining the lock can continue to execute the code in the critical section. If no lock instance is obtained, you can only wait.

For example, to require scripts to only access a certain resource in sequence, such as disk files, you can refer to the following implementation.

#!/bin/bash## file locking using bash.# ver 0.1.6## author : malundao ( malundao@sina.com )# date   : 2011-08-31   # ref    : http://unix.derkeiler.com/Newsgroups/comp.unix.shell/2005-09/0472.html## note:#   shflock_cleanhook() is a user defined function to clean up user-specific sth.## /path/to/lock/. note; directory, not a file.# should be modified LOCKPATH="/tmp"cleanup() {        shflock_cleanhook        cd $LOCKPATH        [ -e lock.pid ] || exit        read pid >/dev/null 2>&1 <lock.pid        if [ -n "$pid" ]; then            if [ "$pid" == "$$" ]; then                rm -f lock.$pid                rm -f lock.pid                exit             fi          fi          exit}#  trap EXIT ? trap 'cleanup' HUP INT TERMgetlock() {        oldpath=`pwd`        cd $LOCKPATH        while                echo $$ > lock.$$                [ -e lock.pid ]         do                rm lock.$$                read pid >/dev/null 2>&1 <lock.pid                if [ -n "$pid" ]; then                        if [ -e /proc/$pid ]; then                                cd $oldpath                                return 1 # Lock is taken by others                        else                                #unsafe: rm -f lock.$pid                                echo WARN: please delete stale lock.pid by HAND.                                return 2                        fi                else                        # sleep some seconds,then back to 'while' loop                        # 11 is a prime number, $$ as a random.                          echo sleep $(( $$ % 11 ))                        sleep $(( $$ % 11 ))                fi        done        # 'ln -s' is an atom op.         ln -s lock.$$ lock.pid >/dev/null 2>&1        if [ $? -eq 0 ]; then                cd $oldpath                return 0 # We got the lock        else                [ -e lock.pid ] || echo WARN: please delete hanging lock.pid by HAND.                cd $oldpath                return 3 # Lock is probably taken by others.        fi}putlock () {    oldpath=`pwd`    cd $LOCKPATH && rm -f lock.$$ lock.pid    cd $oldpath}## test shflock_cleanhook() {    echo i\'m a hook.}while true; do    while ! getlock; do        #echo wait a second...        sleep 1    done    echo \[$$\] `date` ,now hold lock for 3 seconds...    sleep 3    #echo putlock    putlock    sleep 1 # yielddone

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.