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, eexec compton -b
non verrà eseguito. -
Se
pkill compton
fallisce (nessun processo corrisponde al nome o si è verificato un errore interno inpkill
), il corpo diif
istruzione chiamerebbe il tuoexec compton -b
, che sostituirebbe il processo della shell con il processo risultante dall'esecuzione dicompton -b
.