Use pgrep
:
pgrep -cxu $USER -f my-tool
As opções usadas são:
-c, --count
Suppress normal output; instead print a count of matching pro‐
cesses. When count does not match anything, e.g. returns zero,
the command will return non-zero value.
-x, --exact
Only match processes whose names (or command line if -f is spec‐
ified) exactly match the pattern.
-u, --euid euid,...
Only match processes whose effective user ID is listed. Either
the numerical or symbolical value may be used.
Se você quiser usar isso em um script bash que verifica se ele já está em execução, você pode usar $0
. Isso se expande para o caminho do script atual (por exemplo, /home/username/bin/foo.sh
), mas precisamos apenas de foo.sh
. Para conseguir isso, podemos remover tudo até as últimas /
usando as ferramentas de manipulação de string do bash : ${0##*/}
. Isso significa que podemos fazer algo como:
## If there are more than 1 instances of the current script run
## by this user
if [[ $(pgrep -cxu "$USER" "${0##*/}") -gt 1 ]];
then
echo "Script already running, exiting."
exit
fi
Você também pode considerar o uso de arquivos de bloqueio para isso:
## If the lock file exists
if [ -e /tmp/$USER.foo.lock ]; then
## Check if the PID in the lockfile is a running instance
## of foo.sh to guard against crashed scripts
if ps $(cat /tmp/$USER.foo.lock) | grep foo.sh >/dev/null; then
echo "Script foo.sh is already running, exiting"
exit
else
echo "Lockfile contains a stale PID, continuing"
rm /tmp/$USER.foo.lock
fi
fi
## Create the lockfile by printing the script's PID into it
echo $$ > /tmp/$USER.foo.lock
## Rest of the script here
## At the end, delete the lockfile
rm /tmp/$USER.foo.lock