Ich habe eine Gnome-Run-Anwendung in meinem Home-Ordner. Ich habe jetzt die Anwendung hinzugefügt, die ausgeführt wird, wenn ich Meta+ drücke R(ich habe sie inCCSM). Ich führe die Anwendung aus, indem ich sie ./gnome-run
in meinem Home-Ordner ausführe.
Ich kann in der Ausgabe von keine Spur des Anwendungsprozesses finden ps -A
.
Das Problem ist, dass ich das Programm „gnome-run“ geöffnet habe und die Tastenkombination drücke, mit der ich die Anwendung schließen möchte. Gibt es eine Möglichkeit, eine Bash-Datei zu erstellen, die prüft, ob die Anwendung ausgeführt wird? Wenn ja, schließen Sie sie, andernfalls starten Sie sie.
Antwort1
Dieses Shell-Skript sollte das Starten und Stoppen beliebiger Programme handhaben:
#!/bin/bash
BASECMD=${1%%\ *}
PID=$(pgrep "$BASECMD")
if [ "$?" -eq "0" ]; then
echo "at least one instance of "$BASECMD" found, killing all instances"
kill $PID
else
echo "no running instances of "$BASECMD" found, starting one"
$1
fi
Nehmen wir an, Sie haben es unter gespeichert ~/mystarter
. Dann können Sie damit jeden beliebigen Befehl ausführen, indem Sie verwenden ~/mystarter <name>
, in Ihrem Fall beispielsweise bind Meta+ Rto:
~/mystarter gnome-run
und stellen Sie sicher, dass das Skript ausführbar ist: chmod u+x ~/mystarter
. Außerdem ist es wahrscheinlich am besten, es irgendwo in Ihrem abzulegen PATH
, damit Sie nicht jedes Mal den vollständigen Speicherort eingeben müssen.
Wenn dies gnome-run
nicht in angezeigt wird ps -A
, stellen Sie sicher, dass Gnome Run selbst kein Skript ist, das den eigentlichen Prozess startet. Überprüfen Sie, ob es einen Unterschied zwischen ps -A | wc -l
vor und nach dem Start gibt (dies zählt alle laufenden Prozesse).
Bearbeiten:
Da Sie die Antwort akzeptiert haben, dachte ich, ich würde Unterstützung für das Ausführen von Befehlen mit Befehlszeilenargumenten hinzufügen, sodass dies zu einer Referenzstelle werden könnte. Führen Sie einen Befehl wie folgt aus:
./mystarter 'cmd args'
z.B:
./mystarter 'ncmpcpp -c ~/.ncmpcpp'
Der Befehl prüft lediglich, ncmpcpp
ob er bereits ausgeführt wird, führt jedoch den vollständigen Befehl (mit Argumenten) aus, wenn ncmpcpp
er nicht ausgeführt wird.