
Ich führe 3 Apps mit demselben Dateinamen von unterschiedlichen Pfaden aus:
$ ~/app1/main
$ ~/app2/main
$ ~/app3/main
Ich möchte ein Bash-Skript erstellen, das den vollständigen Namen einer ausführbaren Datei akzeptiert und diese App beendet.
$ ./my_killer.sh /home/me/app2/main
Wie kann ich das machen und insbesondere, wie kann ich eine App mit ihrem vollständigen Namen beenden?
Antwort1
Wenn Sie nur Linux unterstützen müssen (was ich annehme, da Ihre Frage mit „Linux“ gekennzeichnet ist), können Sie die symbolischen Links verwenden /proc/%d/exe
.
Hier ist ein Beispiel, wie ein entsprechendes Skript aussehen könnte.
#!/bin/bash
if [ "$#" != 1 ] || [ "$1" = "" ]
then
echo "Usage: $0 <full-exe-path>" 1>&2
exit 1
fi
shopt -s extglob
cd /proc
for PID in [1-9]*([0-9])
do
if [ "$(readlink "$PID"/exe)" = "$1" ]
then
kill "$PID"
fi
done
readlink
Beachten Sie jedoch, dass die Ausführung fehlschlägt , wenn die Prozess-ID ein Kernel-Thread ist oder nicht Ihr Eigentum ist, und "$(readlink "$PID"/exe)"
eine leere Zeichenfolge ausgegeben wird. Um zu vermeiden, dass alle diese Prozesse beendet werden, verweigert das Skript jegliche Ausführung, wenn es $1
sich um eine leere Zeichenfolge handelt.
Beachten Sie auch, dass dieses Skript verwendet wird, extglob
wodurch Verzeichnisse mit übereinstimmen, [1-9]*([0-9])
was ein Zeichen im Intervall bedeutet, 1-9
gefolgt von einer beliebigen Anzahl von Zeichen im Intervall 0-9
.
Antwort2
Ich mache das in einem Einzeiler mit Piping (Sie brauchen gawk
und xargs
):
$>ps -ax | grep "/app2/main" | grep -v "grep" | gawk '{print $1}' | xargs kill
was passiert hier?
ps -ax # — list all processes in extended format
grep "/app2/main" # — show only processes that contain "/app2/main"
grep -v "grep" # — sort out the previous grep process with the mentioned string
gawk '{print $1}' # — use gawk to pick only the first column (process id)
xargs kill # — use xargs to pass pid to kill as an argument
Dadurch wird effektiv ein Kill-Signal an den gewünschten Prozess gesendet. Sie können es in ein Bash-Skript einbinden, wenn Sie einen kurzen Befehl mit einem Argument wünschen.