Вопрос или проблема
У меня есть сервер OpenSSH на моем компьютере с Windows 11, и я могу запускать программы из PowerShell, когда подключаюсь с помощью какого-то клиента SSH.
Однако, когда я отключаюсь, все, что работает в фоновом режиме на компьютере с Windows и запущено из SSH-сессии, также завершает свою работу. Я изучал Start-Process
, Start-Job
и PS-Session
, но похоже, что как только я заканчиваю свою SSH-сессию, запущенный процесс тоже прекращает работу.
На Linux я немного знаком с nohup
, screen
и tmux
, но не знаю ничего подобного для Windows.
Существует ли способ запустить процесс на Windows из сессии PowerShell OpenSSH, который позволяет процессу продолжать работать после моего отключения, либо с возможностью подключения позже, либо просто остановить процесс другим способом?
Ответ или решение
Для пользователей OpenSSH на Windows, столкнувшихся с необходимостью запускать процессы из PowerShell, которые бы продолжали выполняться даже после завершения сеанса SSH, существуют несколько подходов. В отличие от Linux-систем, где широко используются инструменты такие как nohup
, screen
или tmux
, на Windows есть свои методы и инструменты, позволяющие достичь аналогичного эффекта.
Альтернативы nohup
, screen
и tmux
на Windows
-
Использование
Start-Process
с параметром-NoNewWindow
:
При запуске процесса с помощьюStart-Process
, можно передать флаг-NoNewWindow
, что позволит вашему процессу продолжить работать даже после выхода из SSH-сессии. Пример команды:Start-Process "C:\Path\To\Your\Executable.exe" -NoNewWindow
-
PowerShell Background Jobs:
PowerShell позволяет создавать фоновые задания с использованием командлетаStart-Job
. Однако, важно отметить, что такие задания могут завершиться, если SSH-сессия будет закрыта. Чтобы избежать этого, вы можете использовать командлетInvoke-Command
с параметром-AsJob
, который запускает скрипт в фоновом режиме:Invoke-Command -ScriptBlock { Start-Sleep -Seconds 300 } -AsJob
Однако, как и в случае с
Start-Job
, их необходимо будет проверять и управлять прямо через PowerShell, что может быть неудобно в случае отключения. -
Использование Windows Task Scheduler:
Один из самых надежных методов – это использовать планировщик задач Windows. Вы можете создать задачу, которая будет запускать вашу программу в фоновом режиме независимо от SSH-сессии. Для этого:- Откройте "Планировщик задач".
- Создайте новую задачу, указав время или событие для запуска.
- Настройте параметры так, чтобы задача запускалась независимо от того, авторизован ли пользователь или нет.
-
WMI и PowerShell:
Вы можете использовать WMI (Windows Management Instrumentation) для создания процесса, который остается активным даже после разрыва SSH-сессии. Пример кода на PowerShell:$Process = Get-WmiObject -Class Win32_Process | Where-Object { $_.Name -eq "YourProcess.exe" } if (-not $Process) { $null = [System.Diagnostics.Process]::Start("C:\Path\To\YourProcess.exe") }
-
Использование сторонних инструментов:
Если вам нужен более функциональный аналогscreen
илиtmux
, вы можете рассмотреть возможность использования таких инструментов, какConEmu
илиCmder
, которые предоставляют возможности управления терминалом, включая поддержку вкладок и сеансов.
Заключение
Наличие аналогов утилит, подобных nohup
, screen
и tmux
в Windows, зависит от специфических нужд пользователя. Но, благодаря функционалу PowerShell и встроенным инструментам Windows, вы можете эффективно управлять фоновыми процессами даже при использовании OpenSSH.
При выборе конкретного метода необходимо учитывать, как именно вы планируете взаимодействовать с запущенными процессами после отключения от SSH-сессии, и каков уровень удобства тех или иных инструментов.