Esse tipo de coisa pode funcionar. Eu adicionei uma "armadilha" a uma função de shell chamada "quitter", que é chamada se e quando o script inicial obtém um SIGINT.
#!/bin/bash
function quitter {
echo "SIGINT handler, disowning $PID"
disown $PID
exit 1;
}
trap quitter SIGINT
FILE=appcp
./app 1000 &
PID=$! #process ID of app
while true
do
# The app background process uses exit(0) to possibly end.
wait $PID
if [[ -f $FILE ]]
then
echo "Update successfully"
mv $FILE app
chmod "+x" app
./app &
else
echo plain restart
./app &
fi
PID=$! #process ID of app
done
Eu não tenho certeza de que fazer disown
dentro da função de manipulador de armadilhas é a coisa certa a fazer, mas não consigo entender o que você está tentando fazer. Quando eu executar o script com um programa compilado que apenas dorme por 1000 segundos como o "app". Um controle-C do programa "inicial" deixa o "aplicativo" em execução. Este é o bash
4.3.042-3 em uma máquina Arch Linux x86_64 atualizada, kernel 4.1.9.
O grande problema que posso ver com esse método é que, embora o "aplicativo" ainda esteja em execução, não há como o script "inicializador" começar a monitorá-lo novamente. Você terá que matar o "app" de alguma forma, em seguida, invocar o script "starter" para obter um processo "app" monitorado.