Não é possível iniciar um aplicativo gráfico por meio do upstart ou de qualquer outro sistema init, porque, no momento em que o upstart está sendo executado, o X (o ambiente gráfico) ainda não foi iniciado.
No Windows, o ambiente gráfico é parte integrante do sistema operacional; Até mesmo o Windows Server Core é gráfico no coração (mesmo que ele apenas apresente uma janela de prompt de comando). O Linux, por outro lado, adota a abordagem oposta: o sistema em si é apenas baseado em texto, e o ambiente gráfico é fornecido por um aplicativo userspace executado em cima disso.
Então, infelizmente, não há uma maneira fácil de fazer o que você parece ser depois.
Dito isto, poderá conseguir contornar a limitação. Muitos ambientes de desktop fornecem a capacidade de definir uma lista de aplicativos que serão iniciados quando você efetuar login (ou, mais precisamente, iniciar o ambiente de área de trabalho). Você poderia escrever um script que inicie o aplicativo em um loop apertado e saia quando o aplicativo sair com um status de saída zero (o que é normal para "saída bem-sucedida sem um problema"). Se isso vai funcionar para você ou não depende da sua definição de "saída inesperada".
Uma implementação ingênua pode ser algo como:
#!/bin/bash
while true
do
my-app || exit
Xdialog --timeout 15 --yesno "Program exited. Restart it?" 2 50
test "$?" = "0" -o "$?" = "255" || exit
done
O ||
significa "executar o seguinte se o status de saída do anterior for diferente de zero" (é lido "ou"). Veja a documentação do Xdialog sobre como ela funciona; Basicamente, ele pergunta se você deseja continuar executando o programa, e se você responder Sim ou não responder a nada em 15 segundos, ele relança o programa executando o loop mais uma vez. Torne o arquivo de script executável e aponte seu ambiente de área de trabalho ao iniciá-lo no login, e my-app
será executado até que você o feche explicitamente e diga ao sistema para não reiniciá-lo.