3 verschiedene Apps mit demselben Dateinamen an unterschiedlichen Speicherorten. Wie beendet man eine anhand ihres vollständigen Namens?

3 verschiedene Apps mit demselben Dateinamen an unterschiedlichen Speicherorten. Wie beendet man eine anhand ihres vollständigen Namens?

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

readlinkBeachten 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 $1sich um eine leere Zeichenfolge handelt.

Beachten Sie auch, dass dieses Skript verwendet wird, extglobwodurch Verzeichnisse mit übereinstimmen, [1-9]*([0-9])was ein Zeichen im Intervall bedeutet, 1-9gefolgt von einer beliebigen Anzahl von Zeichen im Intervall 0-9.

Antwort2

Ich mache das in einem Einzeiler mit Piping (Sie brauchen gawkund 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.

verwandte Informationen