GNU/Linux >> Tutoriels Linux >  >> Linux

Pourquoi ne puis-je pas obtenir la sortie Pgrep directement sur la variable sur le script bash ?

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 plusieurs compton processus qui ont maintenant été tués, ou au moins signalés, et exec 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 dans pkill ), le corps du if l'instruction appellerait votre exec compton -b , qui remplacerait le processus shell par le processus résultant de l'exécution de compton -b .


Linux
  1. Pourquoi le script Bash ne reconnaît-il pas les alias ?

  2. Pourquoi définir une variable avant une commande est-il légal dans Bash ?

  3. La variable Curl Outfile ne fonctionne pas dans le script Bash ?

  4. Impossible de comprendre ce script. Baiser ?

  5. Pourquoi je ne peux pas échapper aux espaces sur un script bash ??

La redirection de la sortie de la commande vers une variable dans bash échoue

Comment obtenir le PID d'un processus enfant forké dans un script shell

Utiliser la variable Bash dans le script SLURM sbatch

Pourquoi cat /dev/urandom a suspendu mon script bash ?

Comment obtenir uniquement tous les identifiants de processus en cours d'exécution ?

Comment faire en sorte que pgrep affiche les informations complètes sur le processus