No seu código, o primeiro comando killall -q polybar
matará o polybar e depois dormirá por dois segundos.
killall
é extremamente poderoso e seu desempenho é imprevisível, o que significa que não podemos prever quanto tempo levará para terminar completamente um processo e seus filhos.
De acordo com o homem :
killall
é uma ferramenta que fornece uma maneira de matar um processo pelo seu nome, ele envia um sinal para um processo pelo seu nome para finalizá-lo.
Each signal has a current disposition, which determines how the process behaves when it is delivered the signal.
Então você precisa controlar o desempenho de killall
.
Eu acho que seu código se beneficiaria de algumas revisões. Por exemplo, o código deve esperar até que o processo de abate esteja completamente finalizado. Você pode adicionar um linear após killall -q polybar
. Dessa forma, o código aguardará até que os processos tenham sido encerrados:
#!/usr/bin/env bash
# Terminate already running bar instances
killall -q polybar
# Wait until polybar have been completely shut down
while pgrep -u $UID -x polybar >/dev/null; do sleep 2; done
echo 'Launching polybar...'
MONITOR=HDMI1 polybar default &
# Start applets if they're not running
for arg in "dunst" "clipit" "wpa_gui -qt"
do
if ! ps ax | grep -v grep | grep -io "$arg"
then
echo "Launching $arg"
exec $arg &
fi
done
echo 'Polybar launched'
exit 0