Jusqu'à présent, j'ai utilisé
pidof -o %PPID -x "my-tool"
Pour détecter le pid d'une instance éventuellement en cours d'exécution de my-tool.
Ceci est la version courte du fichier my-tool, un script bash exécutable
#!/bin/bash
if pidof -o %PPID -x "my-tool"; then
echo "Already running"
exit 1
fi
... if not running go on
Mais maintenant, je dois autoriser une seule instance par utilisateur et plusieurs par machine , afin que nous puissions même avoir 100 my-tool en cours d'exécution au même moment, mais seulement 1 par utilisateur.
Notez que j'ai besoin d'un test pour créer quelque chose comme un singleton. Si l'outil est démarré et qu'une autre instance est en cours d'exécution, il se ferme automatiquement.
En bref: j'ai besoin qu'un script bash puisse détecter s'il s'exécute déjà pour l'utilisateur actuel et dans ce cas, il doit quitter.
Comment ?
pidof
, il y a de meilleurs outils pour mentirpgrep
Réponses:
Utilisez
pgrep
plutôt:Les options utilisées sont:
Si vous souhaitez l'utiliser dans un script bash qui vérifie s'il est déjà en cours d'exécution, vous pouvez l'utiliser
$0
. Cela se développe sur le chemin du script actuel (par exemple/home/username/bin/foo.sh
) mais nous n'en avons besoin quefoo.sh
. Pour obtenir cela, nous pouvons tout enlever jusqu'au dernier à l'/
aide de bash outils de manipulation de chaînes :${0##*/}
. Cela signifie que nous pouvons faire quelque chose comme:Vous pouvez également envisager d'utiliser des fichiers de verrouillage pour cela:
la source
touch /tmp/$USER.foo.lock
utiliser le PID du processusecho $$ >/tmp/$USER.foo.lock
, une logique pourrait alors être incluse pour tester si un tel processus existe réellement.$(< pidfile)
au lieu de$(cat pidfile)
.Vous pouvez utiliser
pgrep
fo find si un processus est en cours d'exécution par un utilisateur spécifique, puis démarrer le processus s'il n'est pas déjà exécuté par l'utilisateur:La variable d'environnement,,
$USER
sera étendue à l'utilisateur actuellement connecté, c'est-à-dire l'utilisateur exécutant le script. Comme nous voulons seulement savoir si lemy-tool
est en cours d'exécution ou non, il suffit donc d'utiliser directement l'état de sortie avec laif
construction.Utilisez ce script comme un wrapper pour démarrer
my-tool
et faire en sorte que les utilisateurs l'utilisent uniquement ou renommez-le enmy-tool
renommant l'originalmy-tool
en quelque chose d'autre (et changez également le nom dans le script).la source
Essayez-le avec cet extrait:
Il est important de ne pas écrire
pgrep|tr
car cela déboucherait sur un même shell nommé.la source
Enveloppez la commande que vous souhaitez exécuter dans un troupeau pour vous assurer qu'une seule copie s'exécute à la fois. Utilisez un fichier lock_file stocké dans l'arborescence du répertoire personnel d'un utilisateur afin que chaque utilisateur dispose de son propre fichier de verrouillage. Par exemple:
'commande' peut être n'importe quelle commande ou script bash.
man flock
donne des exemples d'utilisationla source
flock
commandement