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 comptonriesce, significa che c'era uno o piùcomptonprocessi che ora sono stati uccisi, o almeno segnalati, eexec compton -bnon verrà eseguito. -
Se
pkill comptonfallisce (nessun processo corrisponde al nome o si è verificato un errore interno inpkill), il corpo diifistruzione chiamerebbe il tuoexec compton -b, che sostituirebbe il processo della shell con il processo risultante dall'esecuzione dicompton -b.