Здравствуйте.
Изначально передо мной стояла задача создать простое приложение, которое обращается к серверу по определённому адресу, забирает оттуда что надо и записывает это в текстовый файлик. Это действие повторяется раз в минуту.
Так как из всех языков программирования я лучше всего знаю C#, то реализовывать задумку я решил в MonoDevelop (нет, использовать современный кросс-платформенный .Net нельзя, долгая история). Я успешно создал соответствующее консольное приложение, оно работает. Но теперь передо мною стоит задача обеспечить работу моей утилиты в фоне, а если конкретно, всё должно быть так:
- Программа запускается пользователем в фоне и не мешает его работе с системой.
- При необходимости, пользователь может остановить программу, при этом соединение с сервером должно быть корректно закрыто (в приложении есть специальный метод-деструктор).
И вот тут у меня начинаются проблемы. Гугл мне подсказывает, что можно что угодно запустить в фоне через терминал если после команды поставить знак &. Пробую, перехожу в каталог с программой, открываю из него терминал, пишу:
sudo mono ProgName.exe &
Получаю ответ:
[1] 1266
Но теперь я нажимаю «Enter» и получаю сообщение, что программа остановлена:
[1]+ Остановлен sudo mono ProgName.exe
Хотя я сильно сомневаюсь, что она вообще запускалась, в файлы вывода не было (если запускать без &, то программа отрабатывает корректно), так же система не запросила пароль, хотя я использовал sudo.
Так что мой первый вопрос: Как правильно запустить моё приложение в фоне? И сразу же задам второй: Возможность вывода чего-либо в консоль в процессе работы может помешать работе приложения в фоне (по факту никуда ничего не выводится же)?
Ну и разумеется, не могу не спросить про будущую остановку программы. Я не знаю как правильно «демонизировать» консольное приложение. И у меня есть серьёзные сомнения, что mono вообще умеет распознавать сигналы о завершении процесса (линукс же шлёт процессу сигнал, когда на него делают kill или ещё как-то пытаются завершить, да?). Поэтому был изобретён следующий костыль: в программе имеется дополнительный поток, который ждёт ввода с консоли. Если ввести нужную команду, программа корректно завершится. Мой план был таков: выводим приложения из фона на передний план, шлём команду, программа корректно завершается. Да, выглядит не очень, но по идеи сценарий когда программу нужно остановить - это редкость, так что и_так_сойдёт.jpg. И потому третий вопрос: это вообще может так работать? И если да, как корректно вывести мою программу из фона?
P.S. всё дело происходит на виртуалке с Debian 11.