Quick-and-dirty way to ensure only one instance of a shell script is running at a time

前端 未结 30 2475
忘掉有多难
忘掉有多难 2020-11-22 02:57

What\'s a quick-and-dirty way to make sure that only one instance of a shell script is running at a given time?

30条回答
  •  故里飘歌
    2020-11-22 03:29

    This example is explained in the man flock, but it needs some impovements, because we should manage bugs and exit codes:

       #!/bin/bash
       #set -e this is useful only for very stupid scripts because script fails when anything command exits with status more than 0 !! without possibility for capture exit codes. not all commands exits >0 are failed.
    
    ( #start subprocess
      # Wait for lock on /var/lock/.myscript.exclusivelock (fd 200) for 10 seconds
      flock -x -w 10 200
      if [ "$?" != "0" ]; then echo Cannot lock!; exit 1; fi
      echo $$>>/var/lock/.myscript.exclusivelock #for backward lockdir compatibility, notice this command is executed AFTER command bottom  ) 200>/var/lock/.myscript.exclusivelock.
      # Do stuff
      # you can properly manage exit codes with multiple command and process algorithm.
      # I suggest throw this all to external procedure than can properly handle exit X commands
    
    ) 200>/var/lock/.myscript.exclusivelock   #exit subprocess
    
    FLOCKEXIT=$?  #save exitcode status
        #do some finish commands
    
    exit $FLOCKEXIT   #return properly exitcode, may be usefull inside external scripts
    

    You can use another method, list processes that I used in the past. But this is more complicated that method above. You should list processes by ps, filter by its name, additional filter grep -v grep for remove parasite nad finally count it by grep -c . and compare with number. Its complicated and uncertain

提交回复
热议问题