Ich versuche, ein Skript zu erstellen, um Compton entweder zu beenden, wenn es ausgeführt wird, oder es zu starten, wenn es nicht ausgeführt wird. Ich habe von man gelesen, dass es 1 beenden sollte, wenn der Prozess gefunden wird, also habe ich versucht, ein Skript zu erstellen, das das verwendet ... Dies funktioniert jedoch einfach nicht. Es beginnt, wenn es geschlossen ist, schließt es aber nicht. was mache ich falsch ??
#!/bin/bash
status=$(pgrep compton 2>&1)
if [[ $status == 1 ]];
then
killall compton
else
exec compton -b
fi
echo $status
Akzeptierte Antwort:
Sie sind Abrufen des pgrep
Ausgabe in Ihrem status
Variable. Es ist einfach nicht die erwartete Ausgabe.
pgrep
gibt die Prozess-IDs (PIDs) der Prozesse aus, die dem von Ihnen angegebenen Muster entsprechen. Wenn es einen Prozess gibt, dessen Name mit compton
übereinstimmt , dann $status
wäre die PID dieses Prozesses oder dieser Prozesse. pgrep
gibt auch einen Exit-Status zurück, aber ein Exit-Status wird nicht durch eine Befehlssubstitution als Zeichenfolge erfasst.
In Ihrem Test vergleichen Sie $status
gegen 1
. Es ist unwahrscheinlich, dass compton
hat PID 1.
Wenn Sie irgendein compton
töten wollen verarbeiten, falls vorhanden, und starten Sie compton -b
wenn kein compton
Prozess existiert, können Sie das mit
#!/bin/sh
if ! pkill compton; then
exec compton -b
fi
Dies verwendet den Exit-Status von pkill
. Das pkill
Das Tool funktioniert ähnlich wie pgrep
(sie werden normalerweise als Paar verteilt und installiert), sondern statt PIDs von übereinstimmenden Prozessen wie pgrep
auszugeben tun würde, pkill
sendet den TERM
Signal (standardmäßig) an die passenden Prozesse.
Der if
Schlüsselwort verwendet den Exit-Status des Befehls, den Sie damit verwenden.
Der !
kehrt den Sinn des Tests um, sodass
-
Wenn
pkill compton
erfolgreich ist, bedeutet dies, dass war ein oder mehrerecompton
Prozesse, die jetzt beendet oder zumindest signalisiert wurden, undexec compton -b
wird nicht ausgeführt. -
Wenn
pkill compton
schlägt fehl (kein Prozess stimmte mit dem Namen überein oder es gab einen internen Fehler inpkill
), dem Hauptteil vonif
-Anweisung würde Ihreexec compton -b
aufrufen , wodurch der Shell-Prozess durch den Prozess ersetzt würde, der sich aus der Ausführung voncompton -b
ergibt .