Задать вопрос

Как отследить то, что самопроизвольно закрывает приложения NET в Ununtu?

Здравствуйте.
Собрал автономное приложение NET, под linux-x64, развернул на сервере Ubuntu командой
root@7b34248:~/brusketta/publish/linux-x64# ./Brusketta & exit

Все отлично стартует, после закрытия консоли работает в фоне. Через какое время приложение останавливается(несколько минут), логи приложения - проблем не видят.
Закрываю putty, снова захожу, в процессах все нормально:
65e842e061afe382854856.jpeg
Подскажите пожалуйста, что делать, куда копать? Как отследить то, что роняет приложение?
  • Вопрос задан
  • 264 просмотра
Подписаться 3 Простой Комментировать
Решения вопроса 1
AshBlade
@AshBlade Куратор тега C#
Просто хочу быть счастливым
Автономные приложения под линуксом надо запускать как сервисы через systemd.
Как это сделать можно почитать тут - https://habr.com/ru/companies/timeweb/articles/759966/

С помощью этого, можно будет выставить политику повторного запуска при остановке, логи можно в syslog сохранять и подобное.
Так как ты запускал это все в фоновом режиме и вышел, то родительским процессом стал init, все логи потерялись. Максимум можно дамп ядра получить, но это еще при выставленных настройках.

Также я не услышал про логи (в каком они виде) - если есть лог файл, то смотри там, иначе ничего сказать не могу.

Могу также порекомандовать запускать это все в докере. Немного замороченно, но та же самая функциональность (логи и рестарт), что и в systemd сервисе.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
ky0
@ky0
Миллиардер, филантроп, патологический лгун
Никакое это не автономное приложение. Запускайте как systemd-сервис - тогда будет вам и контроль состояния, и логирование, и перезапуск.
Ответ написан
shurshur
@shurshur
Сисадмин, просто сисадмин...
Если приложение, запущенное через &, попробует написать что-то в консоль, то при невозможности написать в эту консоль начнутся проблемы (приложение словит SIGHUP или SIGPIPE). Решение - перенаправить явно весь вывод в /dev/null:

command > /dev/null 2> /dev/null &

Вместо двух перенаправлений в /dev/null можно одно перенаправление в /dev/null и одно в другой:

command > /dev/null 2>&1 &

Так делать в подобной ситуации необязательно, но часто делают, и полезно знать. Также надо понимать, что запись:

> file

эквивалентна:

>1 file

А запись:

< file

эквивалентна:

<0 file

Всё потому, что стандартные файловые идентификаторы такие: 0 - stdin, 1 - stdout, 2 - stderr.

Также бывают проблемы, когда приложение хочет что-то прочитать с консоли. Можно ему и на вход передать тоже /dev/null:

command > /dev/null 2> /dev/null < /dev/null &

Но даже в таком случае при закрытии консоли bash пошлёт висящему в фоне процессу SIGHUP. Чтобы это не случилось, нужно сделать disown сразу после выполнения команды, и это можно сделать в той же строке:

command > /dev/null 2> /dev/null < /dev/null & disown


Всё это можно сделать одной командой nohup, которая упрощает все эти действия и вывод записывет в файл nohup.out:

nohup command &

Подробнее в man, он довольно короткий и рассказывает всё в деталях.

Иногда приложения не могут работать совсем без терминала, в этом случае их можно запускать в в screen/tmux или docker.

Я не просто так рассказываю: понимать теорию очень полезно, в том числе теперь, надеюсь, не возникнет вопроса, почему длительные и просто даже критические к прерыванию операции настоятельно советуют запускать в screen, а не полагаться на то, что они успешно завершатся без отваливания консоли, и добавление & тут ничего не гарантирует!

Но всё же, совет сразу же научиться использовать systemd (а в других операционных системах и дистрибутивах - возможно свои другие системы управления сервисами) - он ОЧЕНЬ ПРАВИЛЬНЫЙ. Это сложно только в первый раз :)

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

Войдите, чтобы написать ответ

Похожие вопросы