O loop while
não é uma boa ideia. Não há como fugir - apenas corre para sempre - estaticamente . Qualquer número de coisas pode mudar no ambiente e isso não será afetado - e isso pode ser ruim.
Por exemplo, se o executável do shell responsável pelo loop while
for atualizado, o kernel não poderá liberar o espaço em disco para a versão antiga até que esse script seja encerrado, pois ele precisa manter o descritor contanto que seja executado. . E isso é verdade para quaisquer arquivos que o shell possa ter aberto por qualquer razão para executar o loop - todos eles serão mantidos abertos por esse loop while
enquanto ele for executado - para sempre.
E se, céu proibir, há um vazamento de memória em qualquer lugar no shell que executa esse loop - mesmo o mais ínfimo - ele simplesmente continuará a vazar - estaticamente . Ele vai construir desmarcado e o único recurso é para matá-lo com força, em seguida, iniciá-lo apenas para fazer o mesmo mais tarde.
Esta não é a maneira como você deve configurar um processo em segundo plano - pelo menos, não na minha opinião. Em vez disso, como eu acho, deveria haver um ponto de redefinição - uma atualização do script e seu estado. A maneira mais fácil de fazer isso é com exec
. Você pode substituir o processo atual por um novo - mantendo o mesmo PID - mas ainda executando um novo processo .
Por exemplo, se o seu script perl
retornar true depois de ter manipulado com êxito uma modificação de arquivo em algum diretório monitorado:
#!/bin/sh
trap 'rm -rf -- "${ldir%%*.}"' 0 INT
_exec() case $# in
(0) exec env - "PID=$$" "ldir=${TMPDIR:-/tmp}/." \
"$0" "$@";;
(*) export "$@" "boff=0" "lmt=30"
exec "$0" "$@";;
esac
[ "$PID" = "$$" ] || _exec
[ -w "$ldir" ] &&
case $ldir in
(*.) until mkdir -- "$ldir"
do :& ldir=$ldir$$$!
done 2>/dev/null
;;
(*) until /someperlscript.pl ||
[ "$((boff+=1))" -ge "$lmt" ]
do [ -d "$ldir" ] &&
sleep "$boff" || ! break
done
;;esac && _exec ldir PID
... ou algo parecido. Algo que permite que a maquinaria básica por trás do loop seja atualizada de vez em quando.