Você precisa de uma qualidade relativamente única do ambiente em que confiar. Isso não é fácil de encontrar - especialmente se você está chamando um script separado iterativamente em um loop e espera que ele se comporte de maneira diferente para cada ocorrência (por que não partes do mesmo script nesse caso?) .
De qualquer forma, o mais comum é usar um arquivo de travamento - ou algo parecido - para esse tipo de coisa. Para fazer isso, você precisa desse ambiente único. Considere o seguinte:
sh -c 'echo "$PPID" "$$"
for i in 1 2 3 4 5
do sh -c "echo \"\$PPID\""
done'
OUTPUT
25711 28929
28929
28929
28929
28929
28929
Se você puder confiar no chamador que fornece seu pid para você na variável de ambiente $PPID
, pode ser exatamente o que você precisa. Por exemplo:
#!/bin/sh
#script a
LOCKDIR=${TMPDIR:-/tmp}/${0##*/}.$PPID
init() { mkdir "$LOCKDIR" || exit
# do other initialization tasks
}
loop() { : do the iterable tasks here; }
[ -d "$LOCKDIR" ] || init
loop
... e ...
#!/bin/sh
#script b
a='/path/to/script/a'
for stuff in $things
do "$a" "$stuff"
done
rm -rf "${TMPDIR:-/tmp}/${a##*/}.$$"
Sério, no entanto, eu não encontrei muitas situações em que fazer esse tipo de coisa é uma boa idéia - se eu estou chamando outro shell-script iterativamente e eu devo confiar em seu ambiente então eu provavelmente .
fonte o conteúdo do script no shell atual e executá-lo dessa maneira. Eu faria isso, ou seja, se eu tivesse muito certeza de que o script que eu estava executando estava escrito com segurança.