Qual é a melhor maneira de interromper um programa em execução em resposta a outro programa em um script?

0

Meu usecase é um programa yad que usa outro script que monta um sistema de arquivos. O que eu estou fazendo atualmente e um pouco insatisfeito é uma dança complexa de matar e esperar para 'simular' ter o valor de retorno do yad disponível.

(o script de montagem está acima do snippet e é irrelevante. Lembre-se de que envia uma gravação para o 'FD' - não SEL_FD - quando sai ou remonta, que o código abaixo usa para fazer loop ou não dependendo de GAME_SEL e REMOUNTED )

#stdout to FD (to get the selection on exit and still be a background proc)
GAME_SEL=$(mktemp -u -p "${XDG_RUNTIME_DIR}" "${0##*/}.XXXXXXXXXX")
mkfifo "$GAME_SEL"
exec {SEL_FD}<> "$GAME_SEL"

yad \
--width=600 \
--height=660 \
--center \
--window-icon "applications-games" \
--title "Dosbox Launcher with games overlay" \
--text=" Click to play"  \
--list \
--noheaders \
--search-column=2 \
--regex-search \
--column="Path:HD" \
--column="Game Config:TEXT" \
--button=gtk-close:1 \
--button=gtk-ok:0 \
"${CONF_LIST[@]}" \
 2>/dev/null 1>& "$SEL_FD" &
yad_pid=$!

#wait for copy-on-write-drive notification (quit or mount doesn't matter)
#and kill the dialog using yad signal for graceful failure termination
( read -u "$FD"; kill -USR2 $yad_pid ) &
pidof_killer=$!

#wait for yad termination and read its stdout on a timeout. If triggers timeout, it's empty
wait $yad_pid 2>/dev/null
read -t 0.1 -u "$SEL_FD" GAME
exec {SEL_FD}>&- #close FD

#kill the killer if still active
kill $pidof_killer 2>/dev/null
wait $pidof_killer 2>/dev/null #supresses 'Terminated' output too
#if the killer was already dead (it caught a notification), this is 0, otherwise != 0
REMOUNTED=$?

Tanto quanto eu posso dizer eu preciso dessa complexidade porque eu preciso fundo o processo yad para poder matá-lo em resposta à notificação de FD de script de montagem e isso por sua vez faz com que o valor de retorno de yad (não o stdout que é capturado por SEL_FD) para não ser capturado pelo processo de script principal. Existe uma maneira muito melhor de fazer essa lógica? Parece que isso é muito complexo.

    
por i30817 21.06.2018 / 07:10

0 respostas

Tags