Use en su pgrep
lugar:
pgrep -cxu $USER -f my-tool
Las opciones utilizadas son:
-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.
Si desea usar esto en un script bash que verifique si ya se está ejecutando, puede usarlo $0
. Esto se expande a la ruta del script actual (p /home/username/bin/foo.sh
. Ej. ) Pero solo necesitamos foo.sh
. Para conseguir eso, podemos eliminar todo hasta el último /
utilizando golpe de herramientas de manipulación de cadenas : ${0##*/}
. Esto significa que podemos hacer 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
También es posible que desee considerar el uso de archivos de bloqueo para esto:
## 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
pidof
, hay mejores herramientas mentirapgrep