I now have the script behaving as it should, this is a slightly longer function than I had hoped for but as long as it works and I can call it with one line command then the length of the function isn&#39;t such an issue.<br>
<br>I will carry on testing it some more, any feedback/ideas from people here?<br><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">checkForDuplicateScript () {</span><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace">  #Name a temp file for use in this script:</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">  TMPFILE=&quot;/tmp/tempfile-$$-$(date +%s).tmp&quot;</span><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace">  #Get the name of the script:</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">  SCRIPTNAME=$(basename $0)</span><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace">  #Declare INSTANCECOUNT as integer:</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">  declare -i INSTANCECOUNT</span><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace">  #List all running processes matching the script name to a file</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">  # Do not include the copy of grep which will contain the name</span><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace">  ps aux | grep &quot;$SCRIPTNAME&quot; | grep -v &quot;grep&quot; &gt; $TMPFILE</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">  #Get the number of lines in the TEMPFILE</span><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace">  # - wc: count the number of lines in the file</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">  # - cut: Filter to only the first portion of the output, not file name etc...</span><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace">  # - sed: Remove any non numeric characters from output</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">  INSTANCECOUNT=$( wc -l $TMPFILE | cut -d&quot; &quot; -f1 | sed -e &quot;s/[^0-9]//g&quot; )</span><br style="font-family:courier new,monospace">
<br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">  if [ &quot;$INSTANCECOUNT&quot; -gt &quot;1&quot; ]</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">  then</span><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace">    echo &quot;Extra instance found of script: $SCRIPTNAME&quot;</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    echo &quot;Count of instances: $INSTANCECOUNT&quot;</span><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace">    echo &quot;Output from ps:&quot;</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    cat $TMPFILE</span><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace">    exit 1</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">  fi</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">}</span><br style="font-family:courier new,monospace">
<br><br><div class="gmail_quote">On 21 December 2011 13:56, David Halliday <span dir="ltr">&lt;<a href="mailto:david.halliday@gmail.com">david.halliday@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<b>I have solved the strange increment problem!</b><br><br>To demonstrate the issue I created this test script:<br><span style="font-family:courier new,monospace">#!/bin/bash</span><br style="font-family:courier new,monospace">

<span style="font-family:courier new,monospace">#declare an int</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">declare -i INSTANCECOUNT</span><br style="font-family:courier new,monospace">

<br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">echo &quot;basename: $(basename $0)&quot;</span><br style="font-family:courier new,monospace"><br style="font-family:courier new,monospace">

<span style="font-family:courier new,monospace">echo &quot;raw ps output command hard coded:&quot;</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">ps aux | grep test3 | grep -v &quot;grep&quot; | wc -l</span><br style="font-family:courier new,monospace">

<br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">echo &quot;raw ps output command basename:&quot;</span><div class="im"><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">ps aux | grep $(basename $0) | grep -v &quot;grep&quot; | wc -l</span><br style="font-family:courier new,monospace">

<br style="font-family:courier new,monospace"></div><span style="font-family:courier new,monospace">echo &quot;Command substitution test&quot;</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">echo $(ps aux | grep $(basename $0) | grep -v &quot;grep&quot; | wc -l)</span><br style="font-family:courier new,monospace">

<br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">#assign &amp; output 1:</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">INSTANCECOUNT=$(ps aux | grep $(basename $0) | grep -v &quot;grep&quot; | wc -l)</span><br style="font-family:courier new,monospace">

<span style="font-family:courier new,monospace">echo &quot;Count 1: $INSTANCECOUNT&quot;</span><br style="font-family:courier new,monospace"><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">#assign &amp; output 2:</span><br style="font-family:courier new,monospace">

<span style="font-family:courier new,monospace">INSTANCECOUNT=$(ps aux | grep $(basename $0) | grep -v &quot;grep&quot; | wc -l 2&gt;/dev/null)</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">echo &quot;Count 2: $INSTANCECOUNT&quot;</span><br style="font-family:courier new,monospace">

<br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">#assign &amp; output 3:</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">INSTANCECOUNT=$(ps aux | grep test3 | grep -v &quot;grep&quot; | wc -l)</span><br style="font-family:courier new,monospace">

<span style="font-family:courier new,monospace">echo &quot;Count 3: $INSTANCECOUNT&quot;</span><br style="font-family:courier new,monospace"><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">#assign &amp; output 4:</span><br style="font-family:courier new,monospace">

<span style="font-family:courier new,monospace">INSTANCECOUNT=$(ps aux | grep $(basename $0) | grep -v &quot;grep&quot; | wc -l | sed -e &quot;s/[^0-9]//g&quot;)</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">echo &quot;Count 4: $INSTANCECOUNT&quot;</span><br>

<br>This produced the output:<br><span style="font-family:courier new,monospace">raw output command hardcoded:</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">1</span><br style="font-family:courier new,monospace">

<span style="font-family:courier new,monospace">raw output command:</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">1</span><br style="font-family:courier new,monospace">

<span style="font-family:courier new,monospace">Command substitution test</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">2</span><br style="font-family:courier new,monospace">

<span style="font-family:courier new,monospace">Count 1: 2</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">Count 2: 2</span><br style="font-family:courier new,monospace">

<span style="font-family:courier new,monospace">Count 3: 2</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">Count 4: 2</span><br style="font-family:courier new,monospace">

<br>When I used another process, say grep for sql rather than $(basename $0) the counts were as expected!<br>Then I twigged, this was an issue of the ps command running using command substitution. In sohort by using command substitution &quot;$()&quot; a sub process was being created this was in turn creating an extra entry within ps which went as soon as the command substitution finished. Having done work with sub processes and simultanious processing under bash before I should have known. For those interested some links:<br>

<ul><li>Subshells (slightly different but same behaviour in ps demonstrated): <a href="http://tldp.org/LDP/abs/html/subshells.html" target="_blank">http://tldp.org/LDP/abs/html/subshells.html</a></li><li>bash internal variables ($BASHPID and $$ useful for looking at processes and sub processes by ID): <a href="http://tldp.org/LDP/abs/html/internalvariables.html" target="_blank">http://tldp.org/LDP/abs/html/internalvariables.html</a></li>

</ul><p>Note, $BASHPID is fairly new, only in bash v4 and up, to test:</p><p><span style="font-family:courier new,monospace">echo $BASH_VERSINFO[0]</span><br></p>If you have over version 4 then you can test with this in a script:<br>

<span style="font-family:courier new,monospace">#!/bin/bash</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">echo &quot;Bash ID: $$ : $BASHPID : $BASH_SUBSHELL&quot;</span><br style="font-family:courier new,monospace">

<span style="font-family:courier new,monospace">echo $(echo &quot;Bash ID: $$ : $BASHPID : $BASH_SUBSHELL&quot;)</span><br style="font-family:courier new,monospace"><br>Interesting results, and worth thinking about if you are writing clever scripts!<br>

<br>So, as a result I&#39;m not 100% trusting of my script and now I understand a little more why!<br><b><br>So, it&#39;s still on with the script/library!</b><br>For the sake of sanity I have made the change to my test case.<br>

<br><div>controlLib.sh</div><div>=========<br></div><span style="font-family:courier new,monospace">checkForDuplicateScript () {</span><div class="im"><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">  SCRIPTNAME=$(basename $0)</span><br style="font-family:courier new,monospace">

<span style="font-family:courier new,monospace">  #declare INSTANCECOUNT as integer                                             </span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">  declare -i INSTANCECOUNT</span><br style="font-family:courier new,monospace">

<span style="font-family:courier new,monospace">  INSTANCECOUNT=$(ps aux | grep &quot;$SCRIPTNAME&quot; | grep -v &quot;grep&quot; | wc -l 2&gt;/dev/null)</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">  if [ &quot;$INSTANCECOUNT&quot; -gt &quot;2&quot; ]</span><br style="font-family:courier new,monospace">

<span style="font-family:courier new,monospace">  then</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    echo &quot;Extra instance found of script: $SCRIPTNAME : Full ps output: &quot;</span><br style="font-family:courier new,monospace">

<span style="font-family:courier new,monospace">    ps aux | grep &quot;$SCRIPTNAME&quot;</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    echo &quot;Instance Count: $INSTANCECOUNT : $BASHPID : $SCRIPTNAME&quot;</span><br style="font-family:courier new,monospace">

<span style="font-family:courier new,monospace">    exit 1</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">  fi</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">}</span><br style="font-family:courier new,monospace">

<br></div>Still produces the same behaviour, so I will presume that bash kindly allows you to have overkill on function declaration (that&#39;s how I have been getting away with it all this time, but being lazy will prevent that from now on). <br>

<br>So, the game is still on!<br><br><br><div class="gmail_quote"><div class="im">On 21 December 2011 12:37, David Halliday <span dir="ltr">&lt;<a href="mailto:david.halliday@gmail.com" target="_blank">david.halliday@gmail.com</a>&gt;</span> wrote:<br>
</div><div><div class="h5"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I&#39;ll give that a try but since all my other functions have been working as expected to date with that format I&#39;ll put it down as overkill.<br>Functions Doc: <a href="http://tldp.org/LDP/abs/html/functions.html" target="_blank">http://tldp.org/LDP/abs/html/functions.html</a><br>


<br>I&#39;ll give that a try to see if it&#39;s what is causing the strange behaviour.<div><div><br><br><div class="gmail_quote">On 21 December 2011 12:27, Laurence Southon <span dir="ltr">&lt;<a href="mailto:laurence@southon.uk.net" target="_blank">laurence@southon.uk.net</a>&gt;</span> wrote:<br>


<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 20/12/11 21:32, David Halliday wrote:<br>
&gt; function checkForDuplicateScript(){<br>
<br>
I don&#39;t know if it&#39;s the reason but that function declaration should be<br>
either:<br>
<br>
function checkForDuplicateScript { ... }<br>
<br>
or<br>
<br>
checkForDuplicateScript () { ... }<br>
<br>
Not the keyword &#39;function&#39; and &#39;()&#39; at the same time.<br>
<span><font color="#888888"><br>
LS<br>
--<br>
Laurence Southon<br>
Tiger Computing, Bexley<br>
<a href="http://www.tiger-computing.co.uk" target="_blank">www.tiger-computing.co.uk</a><br>
<br>
_______________________________________________<br>
Kent mailing list<br>
<a href="mailto:Kent@mailman.lug.org.uk" target="_blank">Kent@mailman.lug.org.uk</a><br>
<a href="https://mailman.lug.org.uk/mailman/listinfo/kent" target="_blank">https://mailman.lug.org.uk/mailman/listinfo/kent</a><br>
</font></span></blockquote></div><br>
</div></div></blockquote></div></div></div><br>
</blockquote></div><br>