Вы не можете запустить графическое приложение через upstart или любую другую систему инициализации, потому что во время выполнения upstart X (графическая среда) еще не запущена.
В Windows графическая среда является неотъемлемой частью операционной системы; даже ядро Windows Server является графическим в основе (хотя оно предоставляет только окно командной строки). Linux, с другой стороны, использует противоположный подход: сама система основана только на тексте, а графическая среда обеспечивается приложением пользовательского пространства, работающим поверх этого.
Так что, к сожалению, нет простого способа сделать то, к чему вы стремитесь.
Тем не менее, вы можете обойти ограничение. Многие среды рабочего стола предоставляют возможность определять список приложений, которые будут запускаться при входе в систему (или, точнее, запускать среду рабочего стола). Вы могли бы написать скрипт, который запускает приложение в тесном цикле и завершается, когда приложение выходит с нулевым статусом выхода (что является нормальным для "успешного выхода без проблем"). Будет ли это работать для вас или нет, зависит от вашего определения "неожиданный выход".
Наивная реализация может быть чем-то вроде:
#!/bin/bash
while true
do
my-app || exit
Xdialog --timeout 15 --yesno "Program exited. Restart it?" 2 50
test "$?" = "0" -o "$?" = "255" || exit
done
||
означает «выполнить следующее, если состояние выхода из предыдущего было ненулевым» (читается "или"). Посмотрите документацию Xdialog, чтобы узнать, как это работает; По сути, он запрашивает, хотите ли вы продолжить выполнение программы, и если вы отвечаете Да или ничего не отвечаете в течение 15 секунд, он перезапускает программу, выполняя цикл еще раз. Сделайте исполняемый файл скрипта и укажите своей рабочей среде на запуск при входе в систему, и my-app
будет работать, пока вы явно не закроете его и не скажете системе не перезапускать его.