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 compton
uspěje, znamená to, že bylo jeden nebo několikcompton
procesy, které byly nyní zabity nebo alespoň signalizovány, aexec compton -b
nebude proveden. -
Pokud
pkill compton
selže (názvu neodpovídá žádný proces nebo došlo k nějaké vnitřní chybě vpkill
), těloif
příkaz by zavolal vášexec compton -b
, který by nahradil proces shellu procesem vyplývajícím ze spuštěnícompton -b
.