GNU/Linux >> Linux Esercitazione >  >> Linux

Perché non riesco a ottenere l'output di Pgrep direttamente su variabile sullo script Bash?

Sto cercando di creare uno script per uscire da Compton se è in esecuzione o avviarlo se non è in esecuzione. Ho letto da man che dovrebbe uscire da 1 se viene trovato il processo, quindi ho provato a creare uno script che lo usi ... Tuttavia questo non funziona, si avvia se è chiuso ma non lo chiude. cosa sbaglio??

#!/bin/bash


status=$(pgrep compton 2>&1)

if [[ $status == 1 ]];
    then
        killall compton
    else
        exec compton -b
fi

echo $status

Risposta accettata:

Tu sei ottenere il pgrep output nel tuo status variabile. Semplicemente non è l'output che ti aspetti che sia.

pgrep restituisce gli ID di processo (PID) dei processi che corrispondono al modello fornito. Se esiste un processo il cui nome corrisponde a compton , quindi $status sarebbe il PID di quel processo o di quei processi. pgrep restituisce anche uno stato di uscita, ma uno stato di uscita non viene catturato da una sostituzione di comando come stringa.

Nel tuo test, confronti $status contro 1 . È improbabile che compton ha PID 1.

Se vuoi uccidere qualsiasi compton processate se esistono e avviate compton -b se nessun compton esiste un processo, puoi farlo con

#!/bin/sh

if ! pkill compton; then
    exec compton -b
fi

Questo utilizza lo stato di uscita di pkill . Il pkill lo strumento funziona in modo equivalente a pgrep (di solito sono distribuiti e installati in coppia) ma invece di emettere PID di processi corrispondenti come pgrep farebbe, pkill invia il TERM segnale (di default) ai processi di abbinamento.

Il if la parola chiave utilizza lo stato di uscita del comando che utilizzi con essa.

Il ! inverte il senso del test in modo che

  • Se pkill compton riesce, significa che c'era uno o più compton processi che ora sono stati uccisi, o almeno segnalati, e exec compton -b non verrà eseguito.

  • Se pkill compton fallisce (nessun processo corrisponde al nome o si è verificato un errore interno in pkill ), il corpo di if istruzione chiamerebbe il tuo exec compton -b , che sostituirebbe il processo della shell con il processo risultante dall'esecuzione di compton -b .


Linux
  1. La variabile Curl Outfile non funziona nello script Bash?

  2. Ottieni il percorso completo da Bash Script?

  3. Non riesco a capire questo script. Bash?

  4. Stampa l'output dell'istruzione cat nel ciclo di script bash

  5. Come ottenere il PID dal processo figlio biforcuto nello script della shell

Realizzando il primo script Bash, non riesci a far "attaccare" il comando Cd?

Il reindirizzamento dell'output del comando a una variabile in bash non riesce

Usa la variabile Bash all'interno dello script sbatch SLURM

Perché cat /dev/urandom ha bloccato il mio script bash?

Esegui il comando bash sulla pipeline jenkins

Reindirizzare l'output del comando time in unix in una variabile in bash?