Как предотвратить смерть программы, когда ее сеанс ssh умирает?

У меня действительно старое консольное приложение, которое я хочу сделать немного более упругим. Программа используется следующим образом:

  • пользователь использует специальный эмулятор терминала для подключения к удаленному компьютеру через ssh
  • пользователь запускает сценарий оболочки
  • сценарий оболочки может начать длительный процесс обработки базы данных.

Очевидно, что иногда пользователи просто теряют соединение ssh с машиной, и в этом случае сеанс ssh завершается, скрипт оболочки, запущенный внутри, завершается, и, наконец, процесс базы данных прогресса также прекращается. В одном случае из тысячи это вызывает коррупцию в базе данных, поэтому я хотел бы предотвратить ее.

То, что я пробовал до сих пор:

  • начиная с экрана или сеанса tmux перед запуском сценария оболочки – это не работает, потому что для приложения требуется переменная TERM, которая должна быть установлена ​​на значение386 (и она обходит termcap / terminfo полностью … ugh …)
  • nohup / отключить процесс выполнения – это не сработает, потому что сценарий оболочки и процесс прогресса непрерывно обмениваются друг с другом неясными способами

Любая другая идея о том, как убедиться, что процесс прогресса не завершится, когда сеанс ssh убит?

Добавьте term at386 к вашему .screenrc, чтобы переопределить TERM. Если это не помогает, попробуйте dtach вместо Screen (который сам не использует эмуляцию терминала).

Во многих случаях самым простым решением является использование nohup и включение неинтерактивного процесса в фоновый режим с использованием & и перенаправления стандартного вывода и стандартной ошибки в файлы.

Другими словами, вы ищете что-то вроде экрана, но это передает контрольные последовательности терминалу, а не выполняет собственный перевод? Попробуйте dtach . Он обеспечивает ту же функцию отрыва терминала, что и экран, но без нескольких окон или эмуляции терминала.

Возможно, попробуйте удаленный рабочий стол X через vnc или nx. Вы можете туннелировать vnc поверх ssh для обеспечения безопасности или использовать nx, который выполняется по ssh по умолчанию (и намного быстрее). Затем приложение может работать в терминале на рабочем столе X, и если соединение будет потеряно, рабочий стол продолжит работу, разрешая пересоединение в любое время. Мое предпочтение – отсутствие машины NX, которая бесплатна для двух одновременных пользователей и устанавливается очень легко.

Альтернативой, если доступно, является использование удаленной консоли через ALOM, ILOM, DRAC, IP-kvm или IP-последовательную консоль и т. Д. Таким образом, приложение будет работать на консоли и не может быть прервано сбоем подключения ,