Hasta ahora solía
pidof -o %PPID -x "my-tool"
Para detectar el pid de una instancia eventualmente en ejecución de my-tool.
Esta es la versión corta del archivo my-tool, un script bash ejecutable
#!/bin/bash
if pidof -o %PPID -x "my-tool"; then
echo "Already running"
exit 1
fi
... if not running go on
Pero ahora necesito permitir una sola instancia por usuario y múltiples por máquina , por lo que podemos tener incluso 100 mi herramienta ejecutándose en el mismo momento, pero solo 1 por usuario.
Tenga en cuenta que necesito una prueba para crear algo así como un singleton. Si la herramienta se iniciará y hay otra instancia ejecutándose, se cerrará sola.
En resumen: necesito que un script bash pueda detectar si ya se está ejecutando para el usuario actual y, en este caso, debe salir.
Cómo ?
pidof
, hay mejores herramientas mentirapgrep
Respuestas:
Use en su
pgrep
lugar:Las opciones utilizadas son:
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 necesitamosfoo.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:También es posible que desee considerar el uso de archivos de bloqueo para esto:
fuente
touch /tmp/$USER.foo.lock
usar el PID del proceso,echo $$ >/tmp/$USER.foo.lock
entonces podría incluirse la lógica para probar si tal proceso realmente existe.$(< pidfile)
lugar de$(cat pidfile)
.Puede usar
pgrep
fo find si un proceso está siendo ejecutado por un usuario específico y luego iniciar el proceso si el usuario aún no lo está ejecutando:La variable de entorno
$USER
, se expandirá al usuario actualmente conectado, es decir, el usuario que ejecuta el script. Como solo estamos interesados en si semy-tool
está ejecutando o no, basta con usar el estado de salida directamente con laif
construcción.Use este script como envoltorio para comenzar
my-tool
y haga que los usuarios lo usen solo o renómbrelo comomy-tool
y cambie el nombre del originalmy-tool
a otro (y cambie el nombre dentro del script también).fuente
Pruébalo con este fragmento:
Es importante no escribir
pgrep|tr
porque esto se bifurcaría en un mismo shell con nombre.fuente
Envuelva el comando que desea ejecutar en una bandada para asegurarse de que solo se ejecute una copia a la vez. Utilice un archivo lock_file almacenado dentro del árbol de directorio de inicio de un usuario para que cada usuario tenga su propio archivo de bloqueo. Por ejemplo:
'comando' puede ser cualquier comando bash o script.
man flock
da ejemplos de usofuente
flock
comando