Bis jetzt habe ich verwendet
pidof -o %PPID -x "my-tool"
Um die PID einer eventuell laufenden Instanz von my-tool zu erkennen.
Dies ist die Kurzversion von my-tool file, einem ausführbaren Bash-Skript
#!/bin/bash
if pidof -o %PPID -x "my-tool"; then
echo "Already running"
exit 1
fi
... if not running go on
Aber jetzt muss ich eine einzelne Instanz pro Benutzer und mehrere pro Computer zulassen , damit sogar 100 my-tool im selben Moment ausgeführt werden können, aber nur 1 pro Benutzer.
Beachten Sie, dass ich einen Test benötige, um so etwas wie einen Singleton zu erstellen. Wenn das Tool gestartet wird und eine andere Instanz ausgeführt wird, wird es sich selbst schließen.
Kurz gesagt: Ich brauche, dass ein Bash-Skript erkennen kann, ob es bereits für den aktuellen Benutzer ausgeführt wird, und in diesem Fall muss es beendet werden.
Wie man ?
pidof
, es gibt bessere Werkzeuge Lügepgrep
Antworten:
Verwenden Sie
pgrep
stattdessen:Folgende Optionen werden verwendet:
Wenn Sie dies in einem Bash-Skript verwenden möchten, das prüft, ob es bereits ausgeführt wird, können Sie es verwenden
$0
. Dies erweitert sich auf den Pfad des aktuellen Skripts (z. B./home/username/bin/foo.sh
), aber wir brauchen nurfoo.sh
. Um dies zu erreichen, können wir alles bis zum letzten Mal/
mit den String-Manipulationswerkzeugen von bash entfernen :${0##*/}
. Das heißt, wir können so etwas tun:Möglicherweise möchten Sie auch die Verwendung von Sperrdateien in Betracht ziehen:
quelle
touch /tmp/$USER.foo.lock
die PID des Prozesses zuecho $$ >/tmp/$USER.foo.lock
verwenden, könnte eine Logik enthalten sein, um zu testen, ob ein solcher Prozess tatsächlich existiert.$(< pidfile)
statt$(cat pidfile)
.Sie können verwenden, um
pgrep
herauszufinden, ob ein Prozess von einem bestimmten Benutzer ausgeführt wird, und den Prozess dann starten, wenn er nicht bereits vom Benutzer ausgeführt wird:Die Umgebungsvariable
$USER
wird auf den aktuell angemeldeten Benutzer erweitert, dh auf den Benutzer, der das Skript ausführt. Da wir nur daran interessiert sind, ob das ausgeführtmy-tool
wird oder nicht, reicht es aus, nur den Exit-Status direkt mit demif
Konstrukt zu verwenden.Verwenden Sie dieses Skript als Wrapper zum Starten
my-tool
und lassen Sie die Benutzer nur dieses verwenden oder benennen Sie es ummy-tool
und benennen Sie das Originalmy-tool
in etwas anderes um (und ändern Sie auch den Namen im Skript).quelle
Probieren Sie es mit diesem Snippet aus:
Es ist wichtig, nicht zu schreiben,
pgrep|tr
da dies zu einer gleichnamigen Shell führen würde.quelle
Schließen Sie den Befehl, den Sie ausführen möchten, in eine Herde ein, um sicherzustellen, dass jeweils nur eine Kopie ausgeführt wird. Verwenden Sie eine lock_file, die im Home-Verzeichnisbaum eines Benutzers gespeichert ist, damit jeder Benutzer seine eigene Sperrdatei hat. Zum Beispiel:
'Befehl' kann ein beliebiger Bash-Befehl oder ein beliebiges Skript sein.
man flock
gibt Anwendungsbeispielequelle
flock
Kommando überhaupt nicht