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 comptonréussit, cela signifie qu'il y avait un ou plusieurscomptonprocessus qui ont maintenant été tués, ou au moins signalés, etexec compton -bne 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 duifl'instruction appellerait votreexec compton -b, qui remplacerait le processus shell par le processus résultant de l'exécution decompton -b.