Как запустить программу в фоновом режиме
Перейти к содержимому

Как запустить программу в фоновом режиме

  • автор:

Запуск приложения в фоновом режиме

вот у меня есть скрытые значки, это приложения запущенные в фоновом режиме как я понимаю. вот у меня есть собранный exe файл из main.cpp. как мне сделать чтобы мое main.exe приложение не выключалось после нажатия на крестик, а так же оставалось в фоновых приложениях. Возможно мне нужно в c++ файле это реализовать? Приложение консольное

Отслеживать
задан 27 фев 2021 в 15:55
5 3 3 бронзовых знака
27 фев 2021 в 16:20

В зависимости от его действий, возможно стоит переделать приложение в сервис, управляемый без участия UI, а через панель Сервисов?

27 фев 2021 в 17:16

Если у вас приложение оконное, то в ответ на WM_CLOSE не разрушайте окно, а просто скрывайте — и приложение останется висеть в памяти. Чтобы добавить значок в трей, есть функция Win API: docs.microsoft.com/ru-ru/windows/win32/api/shellapi/…. Если приложение консольное, то можно сабклассить окно консоли и далее сделать с ним то же самое (но я этого не делал, так что насколько это сработает для консоли не скажу).

27 фев 2021 в 20:36
@LShadow77 можете сказать как скрывать приложение?)
2 мар 2021 в 10:32

@f211 Вызовом ShowWindow(hWnd,SW_HIDE). docs.microsoft.com/en-us/windows/win32/api/winuser/… Всё это легко гуглится.

3 мар 2021 в 13:45

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Вот, накатал пример. Должен работать (у меня работает), но если есть неточности или ошибки, пусть камрады поправят. При вводе ‘h’ скрывает консоль и размещает стандартную иконку приложения в трее (может появиться в скрытых значках панели). При двойном клике по иконке удаляет её из трея и снова отображает консоль. При вводе ‘q’ — выход. Как выяснилось, субклассить окно консоли, унаследованное от другого процесса, нельзя. По-этому для обработки событий от иконки в этом примере создаётся дополнительное невидимое окно.

#include #include #include #define WMU_TRAY_ICON_MESSAGE (WM_USER+1) #define CLASS_NAME "UnvisibleHandlerWin" LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); HWND g_hConWnd; bool g_bHidden = false; NOTIFYICONDATA g_niData; int main() < WNDCLASS wcl; HWND hWnd; HINSTANCE hInst; MSG msg; char c; g_hConWnd = GetConsoleWindow(); if (!g_hConWnd) return 1; hInst = GetModuleHandle(NULL); ZeroMemory(&wcl,sizeof(WNDCLASS)); wcl.lpfnWndProc = WndProc; wcl.hInstance = hInst; wcl.lpszClassName = CLASS_NAME; RegisterClass(&wcl); hWnd = CreateWindowEx(0,CLASS_NAME,"",0,0,0,0,0,NULL,NULL,hInst,NULL); if (!hWnd) return 1; ZeroMemory(&g_niData,sizeof(NOTIFYICONDATA)); g_niData.cbSize = sizeof(NOTIFYICONDATA); g_niData.uID = 0; g_niData.uFlags = NIF_ICON|NIF_MESSAGE; g_niData.hIcon = LoadIcon(NULL,IDI_APPLICATION); g_niData.hWnd = hWnd; g_niData.uCallbackMessage = WMU_TRAY_ICON_MESSAGE; fputs("Inputs:\n" " h - minimizing console to the system tray\n" " q - quit\n",stdout); while (true) < while (PeekMessage(&msg,hWnd,0,0,PM_REMOVE)) DispatchMessage(&msg); if (g_bHidden) continue; fputs(">", stdout); while (true) < c = getc(stdin); if ((c!=0xA)&&(c!=0xD)) break; >if (c=='h') < if (!Shell_NotifyIcon(NIM_ADD, &g_niData)) < fputs("Something wrong. Can't create the notification icon!\n",stdout); continue; >ShowWindow(g_hConWnd,SW_HIDE); g_bHidden = true; continue; > if (c=='q') break; fputs("Unknown input, try again!\n", stdout); > DestroyWindow(hWnd); return 0; > LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) < if (uMsg==WMU_TRAY_ICON_MESSAGE) < if (lParam==WM_LBUTTONDBLCLK) < Shell_NotifyIcon(NIM_DELETE, &g_niData); ShowWindow(g_hConWnd,SW_SHOW); SetForegroundWindow(g_hConWnd); g_bHidden = false; >> return DefWindowProc(hWnd,uMsg,wParam,lParam); > 

Windows фоновых приложений и конфиденциальности

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

Управление возможностью работы приложения в фоновом режиме

  1. Выберите Начните , а затем выберите Параметры >приложения >приложения & функций.
  2. Прокрутите страницу до нужного приложения , выберите Дополнительные параметры в правой части окна, а затем выберите Дополнительные параметры.
  3. В разделе Разрешения фоновых приложенийв разделе Разрешить запуск этого приложения в фоновом режиме выберите один из следующих параметров:
    • Всегда — приложение работает в фоновом режиме, получает сведения, отправляет уведомления и остается в курсе, даже если вы не используете его активно. Этот параметр может использовать больше энергии.
    • Оптимизированная версия : Windows решает, что будет экономить больше всего энергии, позволяя приложению получать уведомления и периодически обновляться. Этот параметр может ограничивать приложения, использующие много энергии.

Примечание: Вы также можете управлять действиями в фоновом режиме для приложенийс помощью параметров аккумулятора.

Остановка работы приложения в фоновом режиме

Если вы не хотите получать уведомления или обновления для приложения, если оно не используется, вы можете настроить его так, чтобы оно не запускалось в фоновом режиме.

  1. Выберите Начните , а затем выберите Параметры >приложения >приложения & функций.
  2. Прокрутите страницу до нужного приложения , выберите Дополнительные параметры в правой части окна, а затем выберите Дополнительные параметры.
  3. В разделе Разрешения фоновых приложений в разделе Разрешить запуск этого приложения в фоновом режиме выберите Никогда.

Исключения для параметров конфиденциальности

Классические приложения не отображаются в списке приложений. Чтобы разрешить или запретить использование классических приложений, настройте параметры этих приложений.

Примечание: Отличительные характеристики классического приложения. Классические приложения обычно скачиваете из Интернета или с некоторым типом мультимедиа (например, компакт-диском, DVD-диском или USB-накопителем). Их запуск выполняется с помощью файла EXE или DLL и, как правило, они выполняются на устройстве (в отличие от веб-приложений, которые выполняются в облаке). Кроме того, классические приложения можно найти в Microsoft Store.

Управление приложениями, которые могут запускаться в фоновом режиме

  1. Выберите Начните , а затем выберите Параметры >конфиденциальности >фоновых приложений.
  2. В разделе Фоновые приложения убедитесь, что параметр Разрешить приложениям работать в фоновом режимевключен.
  3. В разделе Выберите, какие приложения могут работать в фоновом режимевключите или отключите параметры для отдельных приложений и служб.

Остановка работы большинства приложений в фоновом режиме

  1. Выберите Начните , а затем выберите Параметры >конфиденциальности >фоновых приложений.
  2. В разделе Фоновые приложения убедитесь, что параметр Разрешить приложениям работать в фоновом режимевыключен.

Исключения для параметров конфиденциальности

Классические приложения не отображаются в списке Выберите приложения, которые могут запускаться в фоновом режиме, и на них не влияет параметр Позволить приложениям запускаться в фоновом режиме. Чтобы разрешить или запретить использование классических приложений, настройте параметры этих приложений.

Примечание: Отличительные характеристики классического приложения. Классические приложения обычно скачиваете из Интернета или с некоторым типом мультимедиа (например, компакт-диском, DVD-диском или USB-накопителем). Их запуск выполняется с помощью файла EXE или DLL и, как правило, они выполняются на устройстве (в отличие от веб-приложений, которые выполняются в облаке). Кроме того, классические приложения можно найти в Microsoft Store.

Screen — запускаем приложения в фоновом режиме

Screen — утилита позволяющая запускать приложения в фоновом режиме. Данная утилита полезная тем, что вы можете запустить любой процесс и отключиться от SSH сессии, а процесс продолжит выполняться.

Установка утилиты screen

sudo apt-get install screen 
yum install screen 

Для запуска утилиты достаточно выполнить команду screen после чего вы сразу же попадете в виртуальный терминал. В том случаи если вы используете сразу несколько виртуальных терминалов, будет правильнее, присваивать имя каждому из терминалов чтобы не запутаться.

Для задании имени виртуального терминала нужно выполнить команду с ключом -S

screen -S filecopy 

После выполнения команды вы подключитесь в виртуальный терминал с именем filecopy и можете приступать к работе.

Для отключения от терминала ( запущенная программа продолжит свою работу ) нужно нажать Ctrl+A+D после этого вы попадете в основной терминал.

Для подключения к вашему созданному виртуальному терминалу выполните команду

screen -x имя_терминала 

Либо если у вас создан всего один терминал

screen -r 

Просмотреть список запущенных терминалов можно командой

screen -ls

Полный список команд доступен по команде

man screen

Запуск команд в фоновом режиме

Консультация по продукту 1cloud

Как запустить команду Linux в фоновом режиме, чтобы сразу получить доступ к интерфейсу командной строки?Ответ на этот вопрос Вы узнаете в данном видео. T2M44S

  • Запуск команд в фоновом режиме 2016-01-14 true 640 360

    Синтаксис

    Задачу (например, команду или скрипт) можно перевести в фоновый режим, добавив символ «&» в конец командной строки. Этот оператор переводит команду в фоновый режим и освобождает место в терминале. Команда, выполняемая в фоновом режиме, называется заданием. Во время работы фоновой команды можно выполнять любые другие команды. Синтаксис выглядит следующим образом: command & script-name & /path/to/command arg1 arg2 & command-1 | command-2 arg1 & command-1 | command-2 -arg1 -arg2 >/path/to/output &

    Примеры

    Чтобы перевести команду ls в фоновый режим, введите:
    $ ls *.py > output.txt & Чтобы перевести следующую команду поиска в фоновый режим, добавьте символ «&» в конец командной строки:
    find . -iname «*.mp3» > myplaylist.txt &

    Как найти задания, работающие в фоновом режиме?

    Выполните следующую команду:
    jobs Пример вывода данных:

    [1]- Running find / -iname "*.c" 2> /dev/null > /tmp/output.txt & [2]+ Running grep -R "hostNamed" / 2> /dev/null > /tmp/grep.txt &

    Где
    [1] и [2] идентификаторы заданий.
    Чтобы отобразить идентификаторы процессов для идентификаторов заданий помимо стандартных сведений, передайте параметр -l: jobs –l Пример вывода данных:

    [1]- 7307 Running find / -iname "*.c" 2> /dev/null > /tmp/output.txt & [2]+ 7324 Running grep -R "hostNamed" / 2> /dev/null > /tmp/grep.txt &

    Чтобы отобразить только идентификаторы процессов, введите:
    jobs -p Пример вывода данных:

    7307 7324

    Как прекратить выполнение заданий, работающих в фоновом режиме?

    Для принудительного или постепенного завершения процесса следует использовать команду kill. Синтаксис выглядит следующим образом:

    kill PID kill -15 PID kill -9 PID killall process-Name-Here killall -15 process-Name-Here killall -9 process-Name-Here

    Как переместить процесс из фонового режима в приоритетный?

    Синтаксис: %JOB-ID ИЛИ fg JOB-ID Сначала следует вывести список текущих заданий с помощью команды jobs. Для этого введите: jobs -l Пример вывода данных:

    [1]- 7307 Running find / -iname "*.c" 2> /dev/null > /tmp/output.txt & [2]+ 7324 Running grep -R "hostNamed" / 2> /dev/null > /tmp/grep.txt &

    Чтобы перевести задание job id #2 в приоритетный режим, введите: %2 ИЛИ используйте команду: fg 2 Пример вывода данных:

    grep -R "hostNamed" / 2> /dev/null > /tmp/grep.txt

    Чтобы перевести это задание обратно в фоновый режим, нажмите клавишу Z, удерживая клавишу CTRL. При этом выполнение текущего приоритетного задания будет приостановлено. Введите следующую команду, чтобы перевести задание в фоновый режим:
    %2 &
    ИЛИ используйте команду: bg
    Теперь командное задание grep будет работать в фоновом режиме.

    Краткое описание всех полезных команд

    Описание Команда
    Идентификация выполняемых заданий. jobs
    jobs -l
    ps aux
    Перевод команды или скрипта в приоритетный режим. command &
    /path/to/command &
    /path/to/script arg1 &
    Перевод фонового задания в приоритетный режим. fg n
    %n
    Перевод задания в фоновый режим без его отмены bg n
    %n &

    Примечание: n — это id задания (id задания можно узнать, выполнив команду jobs).

    Тестирование сервера

    • Чек-лист параметров безопасности сервера Windows/Linux
    • Настройка Linux-файрвола iptables: Руководство для начинающих
    • Вывод всех встроенных команд
    • Как настроить vsftpd на Ubuntu

    Ознакомиться с другими инструкциями вы можете на нашем сайте. А чтобы попробовать услугу — кликните на кнопку ниже.

    Поделиться в соцсетях:

    Средняя оценка: 5,0, всего оценок: 22 Спасибо за Вашу оценку! К сожалению, проголосовать не получилось. Попробуйте позже

    191014 Санкт-Петербург ул. Кирочная, 9

    235 70

    1cloud ltd
    2023-05-28 Запуск команд в фоновом режиме
    191014 Санкт-Петербург ул. Кирочная, 9

    235 70

    1cloud ltd

    600 auto

  • Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *