Snažím se vytvořit skript, který buď compton ukončí, pokud běží, nebo jej spustí, pokud neběží. Četl jsem od člověka, že by měl ukončit 1, pokud je nalezen proces, takže jsem se pokusil vytvořit skript, který to používá… To však prostě nefunguje, spustí se, pokud je zavřeno, ale nezavře ho. co dělám špatně??
#!/bin/bash
status=$(pgrep compton 2>&1)
if [[ $status == 1 ]];
then
killall compton
else
exec compton -b
fi
echo $status
Přijatá odpověď:
jste získání pgrep výstup ve vašem status variabilní. Prostě to není výstup, který očekáváte.
pgrep vypíše ID procesů (PID) procesů odpovídající vzoru, který mu zadáte. Pokud existuje proces, jehož název odpovídá compton a poté $status by bylo PID tohoto procesu nebo těchto procesů. pgrep také vrátí návratový stav, ale návratový stav není zachycen substitucí příkazu jako řetězec.
Ve svém testu porovnáváte $status proti 1 . Je nepravděpodobné, že compton má PID 1.
Pokud chcete zabít jakýkoli compton zpracujte, pokud existují, a spusťte compton -b pokud není compton proces existuje, můžete to provést pomocí
#!/bin/sh
if ! pkill compton; then
exec compton -b
fi
Toto používá stav ukončení pkill . pkill nástroj funguje stejným způsobem jako pgrep (obvykle jsou distribuovány a instalovány jako pár), ale namísto výstupu PID odpovídajících procesů, jako je pgrep by stačilo, pkill odešle TERM signál (ve výchozím nastavení) do odpovídajících procesů.
if klíčové slovo používá stav ukončení příkazu, který s ním používáte.
! invertuje smysl testu tak, že
-
Pokud
pkill comptonuspěje, znamená to, že bylo jeden nebo několikcomptonprocesy, které byly nyní zabity nebo alespoň signalizovány, aexec compton -bnebude proveden. -
Pokud
pkill comptonselže (názvu neodpovídá žádný proces nebo došlo k nějaké vnitřní chybě vpkill), těloifpříkaz by zavolal vášexec compton -b, který by nahradil proces shellu procesem vyplývajícím ze spuštěnícompton -b.