LINUX.ORG.RU

Запуск программ в фоне и вывод их на передний план

 


0

2

Здравствуйте. Изначально передо мной стояла задача создать простое приложение, которое обращается к серверу по определённому адресу, забирает оттуда что надо и записывает это в текстовый файлик. Это действие повторяется раз в минуту. Так как из всех языков программирования я лучше всего знаю C#, то реализовывать задумку я решил в MonoDevelop (нет, использовать современный кросс-платформенный .Net нельзя, долгая история). Я успешно создал соответствующее консольное приложение, оно работает. Но теперь передо мною стоит задача обеспечить работу моей утилиты в фоне, а если конкретно, всё должно быть так:

  1. Программа запускается пользователем в фоне и не мешает его работе с системой.
  2. При необходимости, пользователь может остановить программу, при этом соединение с сервером должно быть корректно закрыто (в приложении есть специальный метод-деструктор).

И вот тут у меня начинаются проблемы. Гугл мне подсказывает, что можно что угодно запустить в фоне через терминал если после команды поставить знак &. Пробую, перехожу в каталог с программой, открываю из него терминал, пишу: sudo mono ProgName.exe &
Получаю ответ: [1] 1266

Но теперь я нажимаю «Enter» и получаю сообщение, что программа остановлена: [1]+ Остановлен sudo mono ProgName.exe

Хотя я сильно сомневаюсь, что она вообще запускалась, в файлы вывода не было (если запускать без &, то программа отрабатывает корректно), так же система не запросила пароль, хотя я использовал sudo.

Так что мой первый вопрос: Как правильно запустить моё приложение в фоне? И сразу же задам второй: Возможность вывода чего-либо в консоль в процессе работы может помешать работе приложения в фоне (по факту никуда ничего не выводится же)? Ну и разумеется, не могу не спросить про будущую остановку программы. Я не знаю как правильно «демонизировать» консольное приложение. И у меня есть серьёзные сомнения, что mono вообще умеет распознавать сигналы о завершении процесса (линукс же шлёт процессу сигнал, когда на него делают kill или ещё как-то пытаются завершить, да?). Поэтому был изобретён следующий костыль: в программе имеется дополнительный поток, который ждёт ввода с консоли. Если ввести нужную команду, программа корректно завершится. Мой план был таков: выводим приложения из фона на передний план, шлём команду, программа корректно завершается. Да, выглядит не очень, но по идеи сценарий когда программу нужно остановить - это редкость, так что и_так_сойдёт.jpg. И потому третий вопрос: это вообще может так работать? И если да, как корректно вывести мою программу из фона?

P.S. всё дело происходит на виртуалке с Debian 11.

простое приложение, которое обращается к серверу по определённому адресу, забирает оттуда что надо и записывает это в текстовый файлик

Это приложение называется wget ну или curl

Это действие повторяется раз в минуту.

Это приложение называется cron

Программа запускается пользователем в фоне и не мешает его работе с системой.

При необходимости, пользователь может остановить программу, при этом соединение с сервером должно быть корректно закрыто

Разве 2 ярлыка (или скрипта если речь про консоль), один на запуск другой на остановку тебя не устроят?

ya-betmen ★★★★★
()

Но теперь я нажимаю «Enter» и получаю сообщение, что программа остановлена: [1]+ Остановлен sudo mono ProgName.exe

Скорее всего, вашей программе прилетает SIGTTIN, когда она пытается прочитать стандартный ввод.

Мой план был таков: выводим приложения из фона на передний план, шлём команду, программа корректно завершается.

Вы пытаетесь написать сервис. Работа с сервисами происходит не так. Либо устанавливайте обработчик на сигналы завершения (SIGTERM, SIGINT, SIGHUP…), либо, если нужно передавать команды в сервис, открывайте в нём UNIX-сокет, и напишите отдельное приложение, которое будет в этот сокет слать команды.

То, что вы сейчас пытаетесь сделать, — это костыль, не надо так.

Rootlexx ★★★★★
()

Всем большое спасибо, вы мне очень помогли!

FaceHoof
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.