Is there any mutex/semaphore mechanism in shell scripts?

前端 未结 3 929
名媛妹妹
名媛妹妹 2020-12-05 13:25

I\'m looking for mutex/semaphore/concurrency mechanism in shell script. Consider following situation: Unless \"a\" user does not close the shared file, \"b\" user should no

相关标签:
3条回答
  • 2020-12-05 13:47

    The BashFAQ noted by shellter has some good examples. The basic idea, which I'm moving here so the page is self-contained, is to use an operation that both tests and sets at the same time: mkdir

    mkdir will fail if the directory exists and will make it if it does not. It's an atomic operation and you can use it like so to do a mutex in your shell script (from the above BashFAQ)

    # Bourne
    lockdir=/tmp/myscript.lock
    if mkdir "$lockdir"
    then    # directory did not exist, but was created successfully
        echo >&2 "successfully acquired lock: $lockdir"
        # continue script
    else    # failed to create the directory, presumably because it already exists
      echo >&2 "cannot acquire lock, giving up on $lockdir"
      exit 0
    fi
    

    follow the link for more detail on cleanup and other items.

    0 讨论(0)
  • 2020-12-05 13:50

    See BashFAQ and ProcessManagment for discussions on file locking in Bash.

    Tagging your question as shell (only) limits the number of people that can help you. You may want to add unix, ksh, bash.

    There are numerous questions/answers on this topic posted here already on S.O.

    I hope this helps.

    0 讨论(0)
  • 2020-12-05 13:51

    You can use the flock utility to lock a file / use it as a mutex.

    Example:

    #!/bin/sh -eu
    #advanced bash stuff not needed
    : >> lock #create a file if it doesn't exist
    {
    flock 3 #lock file by filedescriptor
    
    echo $$ working with lock
    sleep 2
    echo $$ done with lock
    
    } 3<lock
    

    Example usage:

    ./mx & ./mx & ./mx & #will run one at a time cuz of the lock
    

    (

    In reply to massimo's point:

    If you don't want to hardcode a filedecriptor number (it should rarely be a problem if you aren't hardcoding 0, 1, or 2, but anyway), then in bash (but not in a POSIX only shell) you can have the system pick a fd for you with:

    {
    flock $fd
    #...
    } {fd}<lock
    

    )

    0 讨论(0)
提交回复
热议问题