J'essaie de créer un script pour quitter compton s'il est en cours d'exécution ou le démarrer s'il ne s'exécute pas. J'ai lu de man qu'il devrait quitter 1 si le processus est trouvé, j'ai donc essayé de créer un script qui l'utilise… Cependant, cela ne fonctionne tout simplement pas, il démarre s'il est fermé mais ne le ferme pas. Qu'est-ce que je fais de mal ??
#!/bin/bash
status=$(pgrep compton 2>&1)
if [[ $status == 1 ]];
then
killall compton
else
exec compton -b
fi
echo $status
Réponse acceptée :
Vous êtes obtenir le pgrep
sortie dans votre status
variable. Ce n'est tout simplement pas la sortie à laquelle vous vous attendiez.
pgrep
génère les ID de processus (PID) des processus correspondant au modèle que vous lui avez donné. S'il existe un processus dont le nom correspond à compton
, puis $status
serait le PID de ce processus, ou de ces processus. pgrep
renvoie également un état de sortie, mais un état de sortie n'est pas capturé par une substitution de commande sous forme de chaîne.
Dans votre test, vous comparez $status
contre 1
. Il est peu probable que compton
a le PID 1.
Si vous voulez tuer n'importe quel compton
traiter s'ils existent, et lancer compton -b
si non compton
processus existe, vous pouvez le faire avec
#!/bin/sh
if ! pkill compton; then
exec compton -b
fi
Ceci utilise le statut de sortie de pkill
. Le pkill
l'outil fonctionne de manière équivalente à pgrep
(ils sont généralement distribués et installés par paire) mais au lieu de sortir les PID des processus correspondants comme pgrep
ferait, pkill
envoie le TERM
signal (par défaut) aux processus correspondants.
Le if
mot-clé utilise le statut de sortie de la commande que vous utilisez avec lui.
Le !
inverse le sens du test de sorte que
-
Si
pkill compton
réussit, cela signifie qu'il y avait un ou plusieurscompton
processus qui ont maintenant été tués, ou au moins signalés, etexec compton -b
ne sera pas exécuté. -
Si
pkill compton
échoue (aucun processus ne correspond au nom, ou il y a eu une erreur interne danspkill
), le corps duif
l'instruction appellerait votreexec compton -b
, qui remplacerait le processus shell par le processus résultant de l'exécution decompton -b
.