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 comptonerfolgreich ist, bedeutet dies, dass war ein oder mehrerecomptonProzesse, die jetzt beendet oder zumindest signalisiert wurden, undexec compton -bwird nicht ausgeführt. -
Wenn
pkill comptonschlägt fehl (kein Prozess stimmte mit dem Namen überein oder es gab einen internen Fehler inpkill), dem Hauptteil vonif-Anweisung würde Ihreexec compton -baufrufen , wodurch der Shell-Prozess durch den Prozess ersetzt würde, der sich aus der Ausführung voncompton -bergibt .